Usar un archivo de plantilla para una URL específica sin crear una página
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 WordPress con algunos enlaces que apuntan a una URL específica con algunos datos de formulario adicionales: (mysite.com/retail/?a=test&b=1234).
Quiero que esa URL (retail) use automáticamente mi archivo de plantilla template-retail.php que tengo en el directorio del tema hijo, sin tener que crear una página llamada "retail" y seleccionar la plantilla de página desde allí. Solo hay contenido externo en el archivo template-retail.php, nada de WordPress en sí.
¿Es esto posible?

Puedes simplemente mirar la URL, cargar el archivo y salir.
Esto se puede hacer cuando WordPress ha cargado 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' ) {
// cargar el archivo si existe
$load = locate_template('template-retail.php', true);
if ($load) {
exit(); // simplemente salir si se encontró y cargó la plantilla
}
}
});
Ten en cuenta que al hacer esto, una página real con el slug "retail" nunca podrá ser utilizada.
Esto es bastante sencillo, pero también está codificado de forma rígida, por lo que si necesitas esto para una sola página está bien. Si necesitas controlar más URLs, echa un vistazo a la solución propuesta en esta respuesta.

Gracias por tu respuesta. No puedo hacer que el código anterior funcione. Esto nunca es verdadero: "if ( $url_path === 'retail' ) {" El $url_path es un string con el valor: "http://example.com/retail"

Prueba con var_dump($url_path);
y mira cómo se ve para ajustar el código. Ese valor depende de tu URL real. Por ejemplo, puede ser diferente para una URL personalizada de inicio o si WordPress está instalado en un subdirectorio. @Keat

Gracias por la respuesta y disculpa la demora en responder.
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) {

Hola, acabo de probar esto y cargó mi plantilla correctamente, pero noté que algunas otras partes de la página no funcionan, por ejemplo, tengo un echo do_shortcode()
en el encabezado pero no funciona y se muestra el shortcode real - ¿tiene esto que ver con que WordPress no inicializa estos una vez que la plantilla se ha cargado debido al exit()
?

La acción init
no es apropiada para lo que estás intentando lograr. Deberías usar el filtro template_include
en su lugar. Combinarías esto con get_query_var
para recuperar los parámetros de la URL y comprobar qué plantilla necesita cargarse. Aquí están los enlaces:
- https://developer.wordpress.org/reference/hooks/template_include/
- https://developer.wordpress.org/reference/functions/get_query_var/
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;
}

La forma correcta de hacer esto en WordPress es usando page-templates
. https://developer.wordpress.org/themes/template-files-section/page-template-files/
Solo necesitas un código para la plantilla de WordPress. En tu tema de WordPress puedes crear una plantilla de página y renombrarla a
page-id.php
Esa página en particular la detectará automáticamente y usará la plantilla.
Por ejemplo, si tu página tiene un ID de 5874, nombrarás la plantilla como page-5784.php
También puedes nombrar la plantilla basándote en el slug de la página. Por ejemplo, si el slug de la página es hello-world
, entonces el nombre de la plantilla será page-hello-world.php
Consulta también: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

@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 deseas ocultar tu página, simplemente uso el plugin simple y efectivo 'https://wordpress.org/plugins/exclude-pages/'
Debo decir que necesitaba una URL para hacer POST o GET a mi propia página y guardar algunos datos de sesión 'WC()->session', y esto resuelve este y otros problemas, porque puedes tener una estructura de código PHP personalizado incluyendo todo el 'require('wp-load') etc' de todo WordPress, WooCommerce etc para trabajar a través de, mysite.com/index.php/MIPAGINA .....
Solo necesitas:
Primero: Crear un archivo dentro de la ubicación de tu tema como una plantilla de la nueva página, algo como 'wp-content/themes/mi-tema/plantillapersonalizada.php' (El comentario es importante para que el 'Nombre de Plantilla' pueda ser observado por WordPress):
<?php /* Template Name: CualquierNombre */
echo 'Hola Mundo';echo '</br>';
var_dump(WC()->session);
var_dump($_POST);
var_dump($_GET);
?>
Segundo: Crear una página en WordPress normalmente a través de 'wp-admin' > Páginas (Digamos un nombre como MIPAGINA, o puedes cambiar el slug como prefieras) y, por supuesto, vincular la plantilla anterior como la plantilla de esta página que se llama 'CualquierNombre' en la sección de atributos de la plantilla.
Entonces, abramos la nueva página 'misitio.com/index.php/MIPAGINA' y verás.
Hola Mundo
object(WC_Session_Handler)#880 .....................
Extras: Creemos funciones de JavaScript o jQuery en el carrito, checkout, o cualquier cosa que puedas imaginar dentro de las etiquetas HTML 'script', e incluyamos código como este:
var data = { action : nombreAccion, dataA : etcA, dataB : etcB}
$.ajax({
type: 'post',
url: 'index.php/MIPAGINA',
data: data,
success: function( response ) {
},
complete: function() {
}
});
