Endpoint per i permalink dei custom post type
Ho un custom post type chiamato "destinations" e ho impostato la maschera EP per il post type su EP_PERMALINK di default. 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 testo questo su un post normale, viene reindirizzato al template che mi serve (ho un template redirect per l'hook del single template)
es. somesite.com/test-category/test/activities/
Ma per il post type (che è gerarchico) semplicemente rimuove l'endpoint dall'url e rimane sul template single-destination.php
es. 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. Sto lottando con questo problema da ore senza risultati :(
Grazie

Un paio di cose. Innanzitutto, i nomi delle tue funzioni devono essere prefissati con qualcosa di unico. WordPress è un ecosistema vasto e qualcun altro ha probabilmente già utilizzato tutti i nomi generici di funzioni che ti vengono in mente.
In secondo luogo, add_rewrite_endpoint
si occupa di aggiungere le variabili di query per te. Quindi non hai bisogno di questo:
add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
$vars[] = "tours";
$vars[] = "activities";
return $vars;
}
Non è una buona idea svuotare le regole di riscrittura ad ogni caricamento. Questo deve essere fatto solo una volta dopo che le tue regole sono state aggiunte, ad esempio all'attivazione del plugin. Quindi la tua funzione add_endpoints
potrebbe essere ridotta così (con un nome di funzione migliore come detto nel primo punto).
<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint('tours', EP_PERMALINK);
add_rewrite_endpoint('activities', EP_PERMALINK);
}
Il che funziona bene per gli articoli. Se vuoi che funzioni per pagine o qualsiasi altro tipo di contenuto gerarchico, dovrai usare la maschera di 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);
}
Ma questo ancora non funzionerà come ti aspetti. Gli endpoint impostano la loro variabile di query uguale a qualsiasi cosa venga dopo. Quindi se il tuo URL è...
yoursite.com/some-country/some-city/activities/asdf
la variabile di query activities sarà asdf. Se non c'è nulla dopo activities
, la tua variabile di query sarà vuota (ma impostata), quindi verrà sempre valutata come falsa quando proverai a catturarla...
<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
if( get_query_var( 'tours' ) )
{
// fai qualcosa!
exit();
}
}
Puoi aggirare questo problema filtrando request
e cambiando il valore delle tue variabili tours e activities a true se sono impostate.
<?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 alla Rewrite API che ho scritto. Tuttavia, le parti rilevanti per la tua domanda sono riassunte sopra.

Grazie per la fantastica risposta! Ho apportato le modifiche secondo il tuo post e la guida. Ma sembra che WordPress stia reindirizzando/rimuovendo l'endpoint e qualsiasi variabile dopo durante il caricamento dell'URL. Non sono sicuro se si tratti di un reindirizzamento canonico o cosa. Ma rimuove solo gli endpoint registrati. Se aggiungo qualcosa di arbitrario alla fine dell'URL ottengo un 404. Ma tours o activities vengono rimossi o reindirizzati all'URL della destinazione singola. :(

Sembra che abbia trovato il problema. Ha a che fare con le impostazioni dei permalink. Avevo un'impostazione personalizzata - /%category%/%postname%/. Ma se la imposto solo su /%postname%/ funziona, non so ancora perché, ma darò un'occhiata. Grazie \0/

Dovresti provare a ripristinare /%category%/%postname%/ ora e potrebbe funzionare di nuovo. Sospetto che il motivo per cui WP stava eliminando la tua roba fosse perché avevi bisogno di svuotare le regole di riscrittura. (Forse.)

Avevo anche un'impostazione personalizzata per i permalink. Sono semplicemente andato nelle Impostazioni dei Permalink e ho cliccato su Salva modifiche senza cambiare nulla, dopodiché l'endpoint ha funzionato.
