Utilizzare un file template per un URL specifico senza creare una pagina

30 mar 2015, 18:03:41
Visualizzazioni: 34.8K
Voti: 23

Mi chiedo se sia possibile utilizzare un file template per un URL specifico senza dover creare una pagina per quel template.

Questo è il mio problema semplificato:

Ho creato una pagina in WordPress con alcuni link che puntano a un URL specifico con alcuni dati aggiuntivi: (mysite.com/retail/?a=test&b=1234).

Vorrei che quell'URL (retail) utilizzi automaticamente il mio file template template-retail.php che ho nella directory del tema child, senza dover creare una pagina chiamata "retail" e selezionare il template della pagina da lì. Nel file template-retail.php c'è solo contenuto esterno, niente che provenga da WordPress stesso.

È possibile?

4
Commenti

Dovresti creare un redirect HTAccess verso il file, quindi elaborare la richiesta lì.

Howdy_McGee Howdy_McGee
30 mar 2015 18:09:55

In questo caso non ho accesso al file .htaccess. C'è qualche altro modo?

Keat Keat
30 mar 2015 18:13:03

Esistono plugin che potrebbero darti accesso per fare questo tipo di operazioni, in ogni caso dovrai caricare un file personalizzato sul server in modo che abbia qualcosa su cui puntare.

Howdy_McGee Howdy_McGee
30 mar 2015 18:16:38

Non sono sicuro di tutti i dettagli del tuo progetto, ma le prime cose che mi vengono in mente sono template_redirect o un endpoint

s_ha_dum s_ha_dum
30 mar 2015 18:29:44
Tutte le risposte alla domanda 4
5
27

Puoi semplicemente controllare l'URL, caricare il file e uscire.

Questo può essere fatto quando WordPress ha caricato il suo ambiente, ad esempio sull'azione 'init'.

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // carica il file se esiste
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // esci semplicemente se il template è stato trovato e caricato
     }
  }
});

Nota che facendo così una pagina reale con slug "retail" non potrà mai essere utilizzata.

Questo approccio è piuttosto semplice, ma anche hardcoded, quindi se hai bisogno di farlo per una singola pagina va bene. Se invece devi controllare più URL, dai un'occhiata alla soluzione proposta in questa risposta.

30 mar 2015 19:37:22
Commenti

Grazie per la tua risposta. Non riesco a far funzionare il codice sopra. Questa condizione non è mai vera: "if ( $url_path === 'retail' ) {" La variabile $url_path è una stringa con il valore: "http://example.com/retail"

Keat Keat
1 apr 2015 12:42:24

Prova a usare var_dump($url_path); per vedere come appare e adatta il codice. Quel valore dipende dal tuo URL reale. Ad esempio, potrebbe essere diverso per un URL home personalizzato o per WordPress installato in una sottocartella. @Keat

gmazzap gmazzap
1 apr 2015 12:45:35

Grazie per la risposta e scusa per il ritardo nella replica. Ho usato questa soluzione e funziona perfettamente. $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {

Keat Keat
13 apr 2015 16:28:52

Ciao, ho appena provato questo metodo e ha caricato correttamente il mio template, ma ho notato che alcune altre parti della pagina non funzionano, ad esempio ho un echo do_shortcode() nell'header ma non funziona e viene visualizzato lo shortcode effettivo - è forse perché WordPress non inizializza questi elementi una volta che il template è stato caricato a causa dell'exit()?

Adrian Adrian
21 set 2020 01:25:53

Aggiornamento al commento precedente: ho cambiato l'hook da init a wp_loaded e ora gli shortcode vengono caricati.

Adrian Adrian
21 set 2020 01:32:15
0
11

L'azione init non è appropriata per quello che stai cercando di ottenere. Dovresti invece utilizzare il filtro template_include. Potresti combinarlo con get_query_var per recuperare i parametri dell'URL e verificare quale template deve essere caricato. Ecco i link:

Codice:

add_filter( 'template_include', 'portfolio_page_template', 99 );

function portfolio_page_template( $template ) {

    if ( is_page( 'portfolio' )  ) {
        $new_template = locate_template( array( 'portfolio-page-template.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }

    return $template;
}
28 mar 2017 06:10:27
0

Il modo WordPress per farlo è utilizzare i page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Hai solo bisogno di un codice per il template di WordPress. Nel tuo tema WordPress puoi creare un template di pagina e rinominarlo in

page-id.php

Quella specifica pagina lo riconoscerà automaticamente e utilizzerà il template.

Ad esempio, se la tua pagina ha un ID 5874, chiamerai il template page-5784.php

Puoi anche nominare il template in base allo slug della pagina. Ad esempio, se lo slug della pagina è hello-world, allora il nome del template sarà page-hello-world.php

Vedi anche: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

3 apr 2017 12:52:24
0

@shivanand-sharma questo è un metodo perfetto e più pulito (https://developer.wordpress.org/themes/template-files-section/page-template-files/) per creare qualsiasi pagina come le altre in WordPress, e se vuoi nascondere la tua pagina, uso semplicemente il plugin efficace 'https://wordpress.org/plugins/exclude-pages/'

Devo dire che avevo bisogno di un URL per fare POST o GET alla mia pagina e salvare alcuni dati di sessione 'WC()->session', e questo risolve questo e altri problemi, perché puoi avere uno scheletro di codice PHP personalizzato includendo tutto il 'require('wp-load') ecc.' di tutto WordPress, WooCommerce ecc. con cui lavorare, tramite mysite.com/index.php/MIAPAGINA .....

Hai solo bisogno di:

Primo: Creare un file all'interno della tua cartella del tema come template della nuova pagina, qualcosa come 'wp-content/themes/miotema/customtemplate.php' (Il commento è importante così che 'Template Name' possa essere riconosciuto da WordPress):

<?php /* Template Name: QualsiasiNome */ 
echo 'Ciao Mondo';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Secondo: Creare una pagina in WordPress normalmente tramite 'wp-admin' > Pagine (Diciamo con un nome come MIAPAGINA, oppure puoi cambiare lo slug come preferisci) e ovviamente collegare il template precedente come template di questa pagina che si chiama 'QualsiasiNome' nella sezione attributi del template.

Quindi, apriamo la nuova pagina 'mysite.com/index.php/MIAPAGINA' e vedrai.

Ciao Mondo
object(WC_Session_Handler)#880 .....................

Extra: Creiamo funzioni JavaScript o jQuery nel carrello, checkout, ovunque tu possa immaginare all'interno di tag HTML 'script', e includiamo codice come questo:

var data = { action : nomeAzione, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MIAPAGINA',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
11 ott 2017 16:00:50