Utilizzare un file template per un URL specifico senza creare una pagina
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?

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.

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"

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

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

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()
?

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:
- https://developer.wordpress.org/reference/hooks/template_include/
- https://developer.wordpress.org/reference/functions/get_query_var/
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;
}

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

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