Punto final de enlace permanente de tipo de publicación personalizada

8

Tengo un tipo de publicación personalizado llamado "destinos" y he configurado la máscara EP para el tipo de publicación por defecto EP_PERMALINK. He agregado un par de puntos finales de la siguiente manera:

add_filter( 'query_vars', 'add_query_vars');

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

add_action('init', 'add_endpoints');

function add_endpoints(){
    global $wp_rewrite; 

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

    $wp_rewrite->flush_rules();
}

Ahora, si pruebo esto en una publicación normal, redirige a la plantilla que necesito (tengo una redirección de plantilla para el enlace de plantilla única)

es decir. somesite.com/test-category/test/activities/

Pero para el tipo de publicación (que es jerárquico) simplemente elimina el punto final de la url y permanece en la plantilla single-destination.php

es decir. somesite.com/destination/south-africa/kruger-national-park/activities/

se convierte

somesite.com/destination/south-africa/kruger-national-park/

Cualquier ayuda u orientación será muy apreciada. He estado luchando con esto durante horas y no hay resultados :(

Gracias

Charl Pretorius
fuente

Respuestas:

25

Un par de cosas Primero, los nombres de sus funciones deben tener como prefijo algo único. WordPress es un gran ecosistema, y ​​es probable que alguien más haya usado todos los nombres de funciones genéricas que se te ocurran.

En segundo lugar, add_rewrite_endpointse encarga de agregar variables de consulta por usted. Entonces no necesitas esto:

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

La limpieza de las reglas de reescritura en cada carga no es una buena idea. Esto solo debe hacerse una vez que se hayan agregado las reglas. Al igual que en la activación del complemento. Entonces, su add_endpointsfunción podría acortarse a esto (con un mejor nombre de función por punto uno arriba).

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

Lo que funciona bien para publicaciones. Si desea que funcione en páginas o en cualquier otro tipo de publicación jerárquica, deberá usar la EP_PAGESmáscara de punto final.

<?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 todavía no va a funcionar como se esperaba para ti. Los puntos finales establecen su variable de consulta igual a lo que viene después. Entonces, si su URL es ...

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

las actividades variables de consulta serán asdf. Si no sigue nada activities, su consulta var estará vacía (pero configurada), por lo que siempre se evaluará como falsa cuando intente detectarla ...

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

Puede evitar esto filtrando requesty cambiando el valor de sus variables de tours y actividades a verdadero si están configurados.

<?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 de Rewrite API que escribí. Sin embargo, las partes relevantes para su pregunta se resumen arriba.

chrisguitarguy
fuente
1
Gracias por la increíble respuesta! He realizado las modificaciones de acuerdo con su publicación y guía. Pero parece que WordPress está redirigiendo / eliminando el punto final y cualquier variable después de cargar la url. No estoy seguro de si es una redirección canónica o qué. Pero solo elimina los puntos finales registrados. Si agrego algo arb al final de la url, obtengo un 404. Pero los recorridos o actividades se eliminan o redirigen a la url de destino único. :(
Charl Pretorius
1
Parece que encontré el problema. Tiene que ver con la configuración del enlace permanente. Tenía una configuración personalizada - /% category% /% postname% /. Pero si lo configuro solo /% postname% / funciona, aún no estoy seguro de por qué, pero lo echaré un vistazo. Gracias \ 0 /
Charl Pretorius
1
Debería intentar cambiarlo nuevamente a /% category% /% postname% / now y podría funcionar nuevamente. Sospecho que la razón por la que WP estaba eliminando tus cosas fue porque necesitabas eliminar las reglas de reescritura. (Quizás.)
chrisguitarguy
1
También tenía una configuración de enlace permanente personalizada. Simplemente fui a Configuración de enlaces permanentes e hice clic en Guardar cambios sin cambiar nada, y luego el punto final funcionó.
yitwail
Esto me ayuda mucho! Muchas gracias hermano!
fdrv