Endpoint permalink di tipo di post personalizzato


8

Ho un tipo di post personalizzato chiamato "destinazioni" e ho impostato la maschera EP per il tipo di post su EP_PERMALINK predefinito. Ho aggiunto un paio di endpoint come segue:

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

Ora, se lo provo su un post normale, reindirizza al modello di cui ho bisogno (ho un modello di reindirizzamento per il gancio del modello singolo)

vale a dire. somesite.com/test-category/test/activities/

Ma per il tipo di post (che è gerarchico) rimuove solo l'endpoint dall'URL e rimane sul modello single-destination.php

vale a dire. somesite.com/destination/south-africa/kruger-national-park/activities/

diventa

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

Qualsiasi aiuto o guida sarà molto apprezzato. Ho lottato con questo per ore e senza risultati :(

Grazie

Risposte:


25

Un paio di cose. Innanzitutto, i nomi delle tue funzioni devono essere preceduti da qualcosa di unico. WordPress è un grande ecosistema e probabilmente qualcun altro ha usato tutti i nomi generici delle funzioni a cui puoi pensare.

In secondo luogo, add_rewrite_endpointsi occupa di aggiungere variabili di query per te. Quindi non è necessario questo:

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

Svuotare le regole di riscrittura su ogni carico non è una buona idea. Questo deve essere fatto solo una volta dopo aver aggiunto le regole. Come per l'attivazione del plugin. Quindi la tua add_endpointsfunzione potrebbe essere abbreviata in questo (con un nome di funzione migliore per punto uno sopra).

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

Che funziona bene per i post. Se vuoi che funzioni su pagine o qualsiasi altro tipo di post gerarchico, dovrai usare la EP_PAGESmaschera endpoint.

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

Ma non funzionerà ancora come previsto per te. Gli endpoint impostano la loro variabile di query uguale a tutto ciò che viene dopo. Quindi se il tuo URL è ...

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

le attività della variabile query saranno asdf. Se non segue nulla activities, la tua query var sarà vuota (ma impostata), quindi verrà sempre valutata come falsa quando provi a catturarla ...

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

Puoi aggirare il problema filtrando requeste modificando il valore dei tuoi tour e delle variabili di attività su true se sono impostati.

<?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;
}

Dovresti dare un'occhiata a questa guida all'API Rewrite che ho scritto. Le parti rilevanti per la tua domanda sono comunque riassunte sopra.


1
Grazie per la fantastica risposta! Ho apportato le modifiche in base al tuo post e alla tua guida. Ma sembra che wordpress stia reindirizzando / rimuovendo l'endpoint e tutti gli errori dopo aver caricato l'URL. Non sono sicuro se si tratta di un reindirizzamento canonico o cosa. Ma rimuove solo gli endpoint registrati. Se aggiungo qualcosa di arb alla fine dell'URL ottengo un 404. Ma i tour o le attività vengono rimossi o reindirizzano all'URL di destinazione singolo. :(
Charl Pretorius,

1
Sembra che ho trovato il problema. Ha a che fare con le impostazioni del permalink. Avevo un'impostazione personalizzata - /% categoria% /% postname% /. Ma se lo imposto solo su /% postname% / funziona, non so perché, ma daremo un'occhiata. Grazie \ 0 /
Charl Pretorius,

1
Dovresti provare a tornare a /% category% /% postname% / ora e potrebbe funzionare di nuovo. Ho il sospetto che il motivo per cui WP stava togliendo le tue cose era perché dovevi svuotare le regole di riscrittura. (Forse.)
chrisguitarguy,

1
Avevo anche un'impostazione personalizzata del permalink. Sono appena andato su Impostazioni permalink e ho fatto clic su Salva modifiche senza modificare nulla, quindi l'endpoint ha funzionato.
yitwail

Questo mi aiuta molto! Grazie mille fratello!
fdrv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.