Endpoint per i permalink dei custom post type

14 feb 2012, 15:42:56
Visualizzazioni: 16.2K
Voti: 8

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

0
Tutte le risposte alla domanda 1
6
27

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.

14 feb 2012 16:56:29
Commenti

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. :(

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

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/

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

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.)

chrisguitarguy chrisguitarguy
15 feb 2012 16:49:30

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.

yitwail yitwail
11 feb 2013 10:29:29

Questo mi è stato di grande aiuto! Grazie mille fratello!

fdrv fdrv
23 lug 2018 21:48:59

Un'altra domanda, come posso aggiungere un endpoint per alcuni custom post type e anche aggiungerlo alla sitemap, in modo che Google sappia che ho anche alcune pagine extra per quel post.

fdrv fdrv
23 lug 2018 21:51:57
Mostra i restanti 1 commenti