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


14

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

Questo è il mio problema semplificato:

Ho creato una pagina in WP con alcuni contenuti di link che rimandano a un URL specifico con alcuni dati del modulo finale: (mysite.com/retail/?a=test&b=1234) .

Voglio che l'URL (vendita al dettaglio) utilizzi automaticamente il mio file modello template-retail.php che ho nella directory del tema figlio, senza dover creare una pagina denominata "vendita al dettaglio" e selezionare la pagina modello da lì. C'è solo contenuto esterno nel file template-retail.php, niente dallo stesso Wordpress.

È possibile?


1
Dovresti creare un reindirizzamento HTAccess al file, quindi elaborare la richiesta lì.
Howdy_McGee

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

ci sono plugin che possono darti accesso per fare questo tipo di cose, in entrambi i casi dovrai caricare un file personalizzato sul server in modo che abbia qualcosa da colpire.
Howdy_McGee

4
Non sono sicuro di tutti i dettagli del tuo progetto, ma le prime cose che vengono in mente sono template_redirecto un endpoint
s_ha_dum

Risposte:


16

Puoi semplicemente guardare l'URL, caricare il file ed uscire.

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

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // load the file if exists
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // just exit if template was found and loaded
     }
  }
});

Si noti che così non si può mai usare una pagina reale con "vendita al dettaglio" di lumache.

Questo è abbastanza semplice, ma anche hardcoded, quindi se ne hai bisogno per una singola pagina va bene. Se hai bisogno di 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. Questo non è mai vero: "if ($ url_path === 'retail') {" $ url_path è una stringa con il valore: " example.com/retail "
Keat

Prova a var_dump($url_path);vedere come appare e regola il codice. Tale valore dipende dal tuo vero URL. Ad esempio, per l'URL home personalizzato o il WP installato nella sottocartella potrebbe essere diverso. @Keat
gmazzap

1
Grazie per la risposta e scusa per la risposta tardiva. 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

5

L' initazione non è appropriata per ciò che stai cercando di ottenere. Dovresti invece utilizzare il template_includefiltro. Combinerai questo con get_query_varper recuperare i parametri URL per verificare quale modello 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;
}

2

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

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

page-id.php

Quella particolare pagina lo raccoglierà automaticamente e utilizzerà il modello.

Ad esempio, se la tua pagina ha un ID di 5874, nominerai il modello come page-5784.php

Puoi anche assegnare un nome al modello in base alla lumaca della pagina. Ad esempio se lo slug della pagina è hello-worldquindi il nome del modello saràpage-hello-world.php

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


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 qualsiasi altra in wordpress, e se vuoi per nascondere la tua pagina, utilizzo semplicemente il plug-in semplice ed efficace ' https://wordpress.org/plugins/exclude-pages/ '

Devo dire che avevo bisogno di un URL per rendere POST o GET sulla mia pagina e salvare alcuni dati di sessione 'WC () -> session', e questo risolve questo e altri problemi, perché puoi avere una spina dorsale personalizzata codice php che include tutto il 'request (' wp-load ') ecc' dell'intero wordpress, woocommerce ecc. con cui lavorare attraverso, mysite.com/index.php/MYPAGE .....

Hai solo bisogno di:

Primo: crea un file all'interno della posizione del tuo tema come modello della nuova pagina, ad esempio "contenuto-wp / themes / mytheme / customtemplate.php" (il commento è importante in modo che il "Nome modello" possa essere osservato da Wordpress):

<?php /* Template Name: WhateverName */ 
echo 'Hello World';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Secondo: crea una pagina su wordpress normalmente tramite 'wp-admin'> Pagine (diciamo un nome come MYPAGE , oppure puoi cambiare la lumaca come preferisci) e ovviamente collegare il modello precedente come modello di questa pagina che è il nome "Qualunque sia il nome" nella sezione degli attributi del modello.

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

Hello World
object(WC_Session_Handler)#880 .....................

Extra: creiamo funzioni javascript o jquery nel carrello, checkout, qualunque cosa tu possa immaginare all'interno dei tag HTML "script", e includiamo un codice come questo:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.