✅ Notizie, temi, plugin WEB e WordPress. Qui condividiamo suggerimenti e le migliori soluzioni per siti web.

Tutorial: Endpoint URL personalizzati con l’API di riscrittura di WordPress

33

Hai mai desiderato di poter estendere singoli post, pagine o tipi di post personalizzati con un modello personalizzato che mantiene la propria struttura URL? Con l’ API di riscrittura di WordPress questo è completamente possibile e non è affatto difficile.

In questo tutorial vedremo come aggiungere una singola visualizzazione del tipo di post personalizzato con un altro slug che carica un modello diverso. In altre parole, se un singolo post di tipo personalizzato ha l’URL "example.com/destination/venice/", puoi aggiungere regole URL per pagine separate con informazioni correlate a ciascuna destinazione, ad esempio "example.com/destination/venice/" /attività/" e “example.com/destination/venice/attractions/”.

Se sei interessato a come aggiungere endpoint alla pagina "Il mio account" di WooCommerce, ho un altro post proprio su questo!

L’API di riscrittura di WordPress ha molte funzioni utili per scrivere le tue regole URL personalizzate. Potresti aver visto la funzione più conosciuta e ampia; add_rewrite_rule(). Questo tutorial utilizza tuttavia il simile add_rewrite_endpoint(), che è molto utile per aggiungere "endpoint" URL (in pratica aggiungendo slug URL personalizzati dopo qualcosa che già esiste, ad esempio dopo la fine di un singolo post o una singola categoria). È possibile ottenere lo stesso risultato utilizzando, add_rewrite_rule()ma il processo di aggiunta degli endpoint è più semplice.

Cosa faremo

Questa guida presumerà che abbiamo creato due tipi di post personalizzati; ‘film’ e ‘attore’. La regola del permalink per un singolo film è "example.com/movie/fight-club/" e per un singolo attore "example.com/actor/brad-pitt/". Vogliamo una pagina separata per ogni film che mostri tutti gli attori in quel film, che si trova su "example.com/movie/fight-club/actors/" e allo stesso modo una pagina separata per ogni attore che mostri tutti i film in cui l’attore è stato, che si trova su "example.com/actor/brad-pitt/movies/".

Non entrerò nei dettagli su come aggiungere questi due tipi di post personalizzati; se hai bisogno di aiuto per fare questa parte, ti consiglio di leggere il mio post su come aggiungere tipi di post personalizzati.

Scrivere il codice

Il primo passo è chiamare add_rewrite_endpoint()una funzione agganciata a init(generalmente tutte le funzioni nell’API di riscrittura sono agganciate a init). per registrare i nostri due endpoint desiderati; ‘film’ e ‘attori’. La funzione accetta due argomenti; prima l’endpoint desiderato (ad es. ‘film’), e in secondo luogo una costante per la posizione in cui l’endpoint dovrebbe "vivere" (ad es. pagine, autore, archivi, ecc.). Guarda la documentazione per quali costanti puoi usare; come per questo esempio il generale EP_PERMALINKva bene:

add_action('init', function() {
    add_rewrite_endpoint('movies', EP_PERMALINK);
    add_rewrite_endpoint('actors', EP_PERMALINK);
});

NB: Se il tuo tipo di post personalizzato è gerarchico, ovvero ha 'hierarchical' => truenel suo register_post_type(), devi cambiare la costante EP_PERMALINKcon EP_PAGES.

Dopo aver salvato questo codice, devi andare su Impostazioni> Permalink e fare semplicemente clic sul pulsante Salva per aggiornare i permalink. Ogni volta che aggiungi o modifichi una regola di riscrittura, devi aggiornare i tuoi permalink affinché funzionino!

Gestione della query vars

Il modo in cui tu come sviluppatore di temi o plugin puoi capire se mostrare o meno i modelli per questi endpoint, è controllando "query vars"; fondamentalmente l’oggetto query globale di WordPress. Lo facciamo chiamando get_query_var()con la query come argomento ("film" o "attori").

Se hai lavorato con add_rewrite_rule()o get_query_var()prima, potresti già essere consapevole del fatto che WordPress non aggiunge automaticamente query personalizzate vars. Di solito dovresti filtrare query_varse aggiungere le tue variabili personalizzate per fare in modo che WordPress le popoli. Tuttavia add_rewrite_endpoint()lo fa automaticamente per noi.

Tuttavia, se proviamo a chiamarlo get_query_var('movies')non sembrerà mai impostato. Questo perché presume che debba avere un valore per essere impostato. Le regole dell’endpoint presuppongono che tutto ciò che viene dopo l’endpoint sia il valore. Ad esempio "example.com/actor/brad-pitt/movies/some-value/" funzionerebbe, perché in questa pagina get_query_var('movies')restituirebbe il valore ‘some-value’. Ma non è quello che vogliamo, vogliamo che funzioni solo con il singolo endpoint. Per risolvere questo problema, dobbiamo collegarci al requestfiltro di WordPress e informare WordPress che se siamo ai nostri endpoint, la query vars dovrebbe aggiungere l’endpoint con un valore (lo abbiamo semplicemente impostato su true).

add_filter('request', function($vars) {
    if (isset($vars['movies'])) {
        $vars['movies'] = true;
    }
    if (isset($vars['actors'])) {
        $vars['actors'] = true;
    }
    return $vars;
});

Se provi ora a usare get_query_vars('movies')quando su "example.com/actor/brad-pitt/movies/" otterresti il ​​valore true(l’importante è che sia stato effettivamente impostato).

Modello di caricamento

Il passo successivo è decidere cosa dovrebbe accadere su questi due endpoint; o in altre parole, quali modelli vuoi caricare. Questa parte dipende da te, potresti agganciarti template_redirectma è davvero consigliato solo se vuoi eseguire un reindirizzamento effettivo. Consiglio di agganciarsi al template_includefiltro e dire semplicemente a WordPress quali modelli utilizzare quando siamo ai nostri endpoint personalizzati. Supponiamo che il tema abbia i modelli PHP single-actor-movies.phpper “example.com/actor//movies/ e single-movie-actors.phpper “example.com/movie//acts/”.

add_filter('template_include', function($template) {
    if (is_singular() && get_query_var('movies')) {
        $post = get_queried_object();
        return locate_template(['single-actor-movies.php']);
    }
    if (is_singular() && get_query_var('actors')) {
        $post = get_queried_object();
        return locate_template(['single-movie-actors.php']);
    }
    return $template;
});

Con questo filtro attivo, WordPress dovrebbe caricare i modelli forniti per i nostri endpoint personalizzati, e all’interno di questi modelli l’ $postoggetto globale sarebbe l’oggetto post singolo correlato prima dell’endpoint, ad esempio l’oggetto post del singolo attore quando siamo al modello per mostrare tutto film in cui è apparso l’attore. Questo ci rende facile interrogare le informazioni che vogliamo mostrare.

Ottenere l’URL del tuo endpoint

Avere i nostri endpoint e pagine personalizzati va bene e dandy, ma da qualche parte dovresti collegarti a quelli. Ad esempio, nel modello di film singolo vorresti un collegamento "Vedi tutti gli attori" che va al tuo endpoint.

Sfortunatamente non esiste una funzione WordPress così semplice per questo. Dovrai creare tu stesso l’URL. Consiglio di utilizzare [get_site_url](https://developer.wordpress.org/reference/functions/get_site_url/)()per gli endpoint a livello di sito o, nel caso precedente, faresti riferimento a un post specifico con [get_the_permalink](https://developer.wordpress.org/reference/functions/get_the_permalink/)()(o all’interno del ciclo o fornendo un ID post) e aggiungendo l’endpoint dopo di esso, in questo modo:

echo get_the_permalink(). '/actors';

Fonte di registrazione: awhitepixel.com

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More