Use un archivo de plantilla para una URL específica sin crear una página

14

Me pregunto si es posible usar un archivo de plantilla para una URL específica sin tener que crear una página para esa plantilla.

Este es mi problema simplificado:

He creado una página en WP con algún contenido de enlace que apunta a una URL específica con algunos datos del formulario final: (mysite.com/retail/?a=test&b=1234) .

Quiero que esa url (minorista) use automáticamente mi archivo de plantilla template-retail.php que tengo en el directorio de temas secundarios, sin tener que crear una página llamada "minorista" y seleccionar la página de plantilla desde allí. Solo hay contenido externo en el archivo template-retail.php, nada del propio Wordpress.

es posible?

Keat
fuente
1
Debería crear una redirección HTAccess al archivo y luego procesar la solicitud allí.
Howdy_McGee
No tengo acceso al archivo .htaccess en este caso. ¿Hay alguna otra manera?
Keat
hay complementos que pueden darle acceso para hacer este tipo de cosas, de cualquier manera necesitará cargar un archivo personalizado en el servidor para que tenga algo que golpear.
Howdy_McGee
44
No estoy seguro acerca de todos los detalles de su proyecto, pero lo primero que se me template_redirect
ocurre

Respuestas:

16

Puede mirar la url, cargar el archivo y salir.

Eso se puede hacer cuando WordPress carga su entorno, por ejemplo, en 'init'.

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // load the file if exists
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // just exit if template was found and loaded
     }
  }
});

Tenga en cuenta que al hacerlo, nunca se puede usar una página real con slug "retail".

Esto es bastante fácil, pero también está codificado, por lo que si necesita esto para una sola página, está bien. Si necesita controlar más URL, eche un vistazo a la solución propuesta en esta respuesta .

gmazzap
fuente
Gracias por tu respuesta. No puedo hacer que el código anterior funcione. Esto nunca es cierto: "if ($ url_path === 'retail') {" El $ url_path es una cadena con el valor: " example.com/retail "
Keat
Intenta var_dump($url_path);ver cómo se ve y ajusta el código. Ese valor depende de tu URL real . Por ejemplo, para la URL de inicio personalizada, o WP instalado en la subcarpeta puede ser diferente. @Keat
gmazzap
1
Gracias por la respuesta, y perdón por la respuesta tardía. Usé esta solución y funciona perfecto. $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {
Keat
5

La initacción no es apropiada para lo que estás tratando de lograr. Deberías usar el template_includefiltro en su lugar. Combinaría esto get_query_varpara recuperar los parámetros de URL para verificar qué plantilla necesita cargarse. Aquí están los enlaces:

Código:

add_filter( 'template_include', 'portfolio_page_template', 99 );

function portfolio_page_template( $template ) {

    if ( is_page( 'portfolio' )  ) {
        $new_template = locate_template( array( 'portfolio-page-template.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }

    return $template;
}
adamj
fuente
2

La forma de WordPress para hacer esto es con page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Solo necesita un código para la plantilla de WordPress. En su tema de WordPress puede crear una plantilla de página y cambiarle el nombre a

page-id.php

Esa página en particular lo recogerá automáticamente y usará la plantilla.

Por ejemplo, si su página tiene una identificación de 5874, nombrará la plantilla como page-5784.php

También puede nombrar la plantilla en función de la babosa de la página. Por ejemplo, si la babosa de la página es, hello-worldentonces el nombre de la plantilla serápage-hello-world.php

Ver también: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

Shivanand Sharma
fuente
0

@ shivanand-sharma este es un método perfecto y más limpio ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ) para crear cualquier página como cualquier otra en wordpress, y si lo desea para ocultar su página, solo uso el complemento simple y efectivo ' https://wordpress.org/plugins/exclude-pages/ '

Debo decir que necesitaba una URL para hacer POST o GET en mi propia página y guardar algunos datos de sesión 'WC () -> session', y esto resuelve este y otros problemas, ya que puede tener una columna vertebral personalizada código php que incluye todos los 'require (' wp-load '), etc.' de todo el wordpress, woocommerce, etc. para trabajar con, mysite.com/index.php/MYPAGE .....

Solo necesitas:

Primero: cree un archivo dentro de la ubicación de su tema como plantilla de la nueva página, algo así como 'wp-content / themes / mytheme / customtemplate.php' (El comentario es importante para que Wordpress pueda observar el 'Nombre de plantilla'):

<?php /* Template Name: WhateverName */ 
echo 'Hello World';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Segundo: cree una página en wordpress normalmente a través de 'wp-admin'> Páginas (Digamos un nombre como MYPAGE , o puede cambiar la babosa lo que quiera) y, por supuesto, vincule la plantilla anterior como la plantilla de esta página, que es nombre 'Cualquiera que sea' en la sección de atributos de la plantilla.

Entonces, abramos la nueva página 'mysite.com/index.php/MYPAGE' y verás.

Hello World
object(WC_Session_Handler)#880 .....................

Extras: creemos funciones de javascript o jquery en el carrito, finalice la compra, lo que sea que pueda imaginar dentro de las etiquetas HTML de 'script' e incluya un código como este:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
Jose Velandia
fuente