Ponto de extremidade permalink de tipo de postagem personalizado

8

Eu tenho um tipo de postagem personalizado chamado "destinos" e configurei a máscara EP para o tipo de postagem como EP_PERMALINK padrão. Adicionei alguns pontos de extremidade da seguinte maneira:

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();
}

Agora, se eu testar isso em uma postagem normal, ele será redirecionado para o modelo necessário (tenho um redirecionamento de modelo para o gancho de modelo único)

ie somesite.com/test-category/test/activities/

Mas para o tipo de postagem (que é hierárquico), ele remove o terminal da URL e permanece no modelo single-destination.php

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

torna-se

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

Qualquer ajuda ou orientação será muito apreciada. Eu tenho lutado com isso por horas e nenhum resultado :(

obrigado

Charl Pretorius
fonte

Respostas:

25

Algumas coisas. Primeiro, seus nomes de função precisam ser prefixados com algo único. O WordPress é um grande ecossistema, e provavelmente alguém usou todos os nomes de funções genéricos que você pode imaginar.

Segundo, add_rewrite_endpointcuida de adicionar variáveis ​​de consulta para você. Então você não precisa disso:

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

Liberar regras de reescrita em todas as cargas não é uma boa ideia. Isso só precisa ser feito uma vez depois que suas regras forem adicionadas. Como na ativação do plugin. Portanto, sua add_endpointsfunção pode estar em curto (com um nome de função melhor por ponto um acima).

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

O que funciona bem para postagens. Se você deseja que ele funcione em páginas ou em qualquer outro tipo de postagem hierárquica, será necessário usar a EP_PAGESmáscara do nó de extremidade.

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

Mas isso ainda não vai funcionar como esperado para você. Os pontos de extremidade definem sua variável de consulta igual ao que vier depois dela. Portanto, se o seu URL for ...

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

as atividades da variável de consulta serão asdf. Se nada activitiesacontecer, sua consulta var estará vazia (mas configurada), portanto será sempre avaliada como falsa quando você tentar capturá-la ...

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

Você pode contornar isso filtrando requeste alterando o valor de suas variáveis ​​de passeios e atividades para true se estiverem 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;
}

Você deve dar uma olhada neste guia da API de reescrita que escrevi. As partes relevantes para sua pergunta estão resumidas acima, no entanto.

chrisguitarguy
fonte
11
Obrigado pela resposta incrível! Fiz as modificações de acordo com o seu post e guia. Mas parece que o wordpress está redirecionando / removendo o endpoint e todos os vars depois de carregar o URL. Não tenho certeza se é um redirecionamento canônico ou o quê. Mas ele remove apenas os pontos de extremidade registrados. Se eu adicionar alguma coisa no final do URL, recebo um 404. Mas os passeios ou atividades são removidos ou redirecionados para o URL de destino único. :(
Charl Pretorius
11
Parece que encontrei o problema. Tem a ver com as configurações do link permanente. Eu tinha uma configuração personalizada - /% category% /% postname% /. Mas se eu defini-lo como /% postname% / / funciona, não sei por que ainda, mas vou dar uma olhada. Obrigado \ 0 /
Charl Pretorius
11
Você deve tentar voltar para /% category% /% postname% / now e pode funcionar novamente. Suspeito que o motivo pelo qual o WP tenha retirado suas coisas foi porque você precisava liberar as regras de reescrita. (Talvez.)
chrisguitarguy
11
Eu também tinha uma configuração personalizada de link permanente. Acabei de acessar as Configurações do Permalinks e cliquei em Salvar alterações sem alterar nada, e então o terminal funcionou.
yitwail
Isso me ajuda muito! Muito obrigado irmão!
fdrv