Endpoint de enlace permanente para tipo de entrada personalizada

14 feb 2012, 15:42:56
Vistas: 16.2K
Votos: 8

Tengo un tipo de entrada personalizado llamado "destinations" y he configurado la máscara EP para el tipo de entrada como EP_PERMALINK por defecto. He añadido un par de endpoints de la siguiente manera:

add_filter( 'query_vars', 'add_query_vars');

// Añadir variables de consulta personalizadas
function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action('init', 'add_endpoints');

// Registrar endpoints personalizados
function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}

Cuando pruebo esto en una entrada normal, redirige a la plantilla que necesito (tengo una redirección de plantilla para el hook single template)

Ejemplo: sitioweb.com/categoria-ejemplo/entrada-ejemplo/activities/

Pero para el tipo de entrada (que es jerárquico), simplemente elimina el endpoint de la URL y se queda en la plantilla single-destination.php

Ejemplo: sitioweb.com/destination/sudafrica/parque-nacional-kruger/activities/

se convierte en

sitioweb.com/destination/sudafrica/parque-nacional-kruger/

Cualquier ayuda u orientación será muy apreciada. Llevo horas lidiando con esto sin resultados :(

Gracias

0
Todas las respuestas a la pregunta 1
6
27

Un par de cosas. Primero, los nombres de tus funciones deben tener un prefijo único. WordPress es un ecosistema grande, y es probable que alguien más ya haya usado todos los nombres genéricos de funciones que puedas imaginar.

Segundo, add_rewrite_endpoint se encarga de añadir las variables de consulta por ti. Así que no necesitas esto:

add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

Vaciar las reglas de reescritura en cada carga no es una buena idea. Esto solo debe hacerse una vez después de que se hayan añadido tus reglas. Como en la activación del plugin. Así que tu función add_endpoints podría acortarse a esto (con un mejor nombre de función según el primer punto).

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);
}

Lo cual funciona bien para entradas. Si quieres que funcione en páginas o cualquier otro tipo de contenido jerárquico, tendrás que usar la máscara de endpoint EP_PAGES.

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PAGES);
    add_rewrite_endpoint('activities', EP_PAGES);
}

Pero eso aún no va a funcionar como esperas. Los endpoints establecen su variable de consulta igual a lo que venga después. Así que si tu URL es...

yoursite.com/some-country/some-city/activities/asdf

la variable de consulta activities será asdf. Si no hay nada después de activities, tu variable de consulta estará vacía (pero definida), por lo que siempre evaluará como falso cuando intentes capturarla...

<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
    if( get_query_var( 'tours' ) )
    {
        // ¡haz algo!
        exit();
    }
}

Puedes solucionar esto filtrando request y cambiando el valor de tus variables tours y activities a true si están definidas.

<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
    if( isset( $vars['tours'] ) ) $vars['tours'] = true;
    if( isset( $vars['activities'] ) ) $vars['activities'] = true;
    return $vars;
}

Deberías echar un vistazo a esta guía sobre la API de Reescritura que escribí. Sin embargo, las partes relevantes para tu pregunta están resumidas arriba.

14 feb 2012 16:56:29
Comentarios

¡Gracias por la increíble respuesta! He realizado las modificaciones según tu publicación y guía. Pero parece que WordPress está redirigiendo/eliminando el endpoint y cualquier variable posterior al cargar la URL. No estoy seguro si es una redirección canónica o qué. Pero solo elimina los endpoints registrados. Si agrego algo arbitrario al final de la URL, obtengo un error 404. Pero "tours" o "activities" son eliminados o redirigen a la URL única del destino. :(

Charl Pretorius Charl Pretorius
15 feb 2012 10:35:42

Parece que encontré el problema. Tiene que ver con la configuración de los enlaces permanentes. Tenía una configuración personalizada - /%category%/%postname%/. Pero si lo configuro solo como /%postname%/ funciona, no sé por qué todavía, pero lo investigaré. ¡Gracias \0/

Charl Pretorius Charl Pretorius
15 feb 2012 11:27:41

Deberías intentar volver a cambiarlo a /%category%/%postname%/ ahora y podría funcionar nuevamente. Sospecho que la razón por la que WP estaba eliminando tus elementos era porque necesitabas actualizar las reglas de reescritura. (Tal vez.)

chrisguitarguy chrisguitarguy
15 feb 2012 16:49:30

Yo también tenía una configuración personalizada de enlaces permanentes. Simplemente fui a Configuración de Enlaces Permanentes y hice clic en Guardar cambios sin modificar nada, y entonces el endpoint funcionó.

yitwail yitwail
11 feb 2013 10:29:29

¡Esto me ayudó mucho! ¡Muchas gracias, hermano!

fdrv fdrv
23 jul 2018 21:48:59

Una pregunta más, ¿cómo puedo añadir un endpoint para un tipo de contenido personalizado y también agregarlo al mapa del sitio, para que Google sepa que tengo una página extra para ese post?

fdrv fdrv
23 jul 2018 21:51:57
Mostrar los 1 comentarios restantes