Folosește un fișier template pentru un URL specific fără a crea o pagină

30 mar. 2015, 18:03:41
Vizualizări: 34.8K
Voturi: 23

Mă întreb dacă este posibil să folosesc un fișier template pentru un URL specific fără a fi nevoit să creez o pagină pentru acel template.

Aceasta este problema mea simplificată:

Am creat o pagină în WordPress cu niște linkuri care trimit către un URL specific cu parametri în query string: (mysite.com/retail/?a=test&b=1234).

Vreau ca acel URL (retail) să folosească automat fișierul meu template template-retail.php pe care îl am în directorul temei copil, fără a trebui să creez o pagină numită "retail" și să selectez template-ul de acolo. În fișierul template-retail.php există doar conținut extern, nimic din WordPress.

Este posibil acest lucru?

4
Comentarii

Ar trebui să creezi o redirecționare HTAccess către fișier, apoi să procesezi cererea acolo.

Howdy_McGee Howdy_McGee
30 mar. 2015 18:09:55

Nu am acces la fișierul .htaccess în acest caz. Există vreo altă metodă?

Keat Keat
30 mar. 2015 18:13:03

Există plugin-uri care îți pot oferi acces pentru a face aceste tipuri de lucruri, oricum va trebui să încarci un fișier personalizat pe server pentru ca acesta să aibă ceva pe care să-l apeleze.

Howdy_McGee Howdy_McGee
30 mar. 2015 18:16:38

Nu sunt sigur despre toate detaliile proiectului tău, dar primele lucruri care îmi vin în minte sunt template_redirect sau un endpoint

s_ha_dum s_ha_dum
30 mar. 2015 18:29:44
Toate răspunsurile la întrebare 4
5
27

Poți pur și simplu să te uiți la URL, să încarci fișierul și să ieși.

Aceasta poate fi realizată când WordPress a încărcat mediul său, de exemplu pe 'init'.

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // încarcă fișierul dacă există
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // ieși doar dacă șablonul a fost găsit și încărcat
     }
  }
});

Reține că, făcând acest lucru, o pagină reală cu slug-ul "retail" nu poate fi niciodată utilizată.

Acest lucru este destul de simplu, dar și hardcodat, așa că dacă ai nevoie de acest lucru pentru o singură pagină, este în regulă. Dacă trebuie să controlezi mai multe URL-uri, aruncă o privire la soluția propusă în acest răspuns.

30 mar. 2015 19:37:22
Comentarii

Mulțumesc pentru răspuns. Nu reușesc să fac codul de mai sus să funcționeze. Această condiție nu este niciodată adevărată: "if ( $url_path === 'retail' ) {" Variabila $url_path este un șir cu valoarea: "http://example.com/retail"

Keat Keat
1 apr. 2015 12:42:24

Încearcă să folosești var_dump($url_path); și vezi cum arată, apoi ajustează codul. Acea valoare depinde de adresa URL reală. De exemplu, pentru un URL personalizat al paginii de start, sau pentru WordPress instalat într-un subfolder, poate fi diferită. @Keat

gmazzap gmazzap
1 apr. 2015 12:45:35

Mulțumesc pentru răspuns și îmi cer scuze pentru întârziere. Am folosit această soluție și funcționează perfect. $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

Salut, tocmai am încercat acest lucru și a încărcat șablonul meu fără probleme, dar am observat că câteva alte elemente din pagină nu funcționează, de exemplu am un echo do_shortcode() în header dar nu funcționează și shortcode-ul real este afișat - are asta legătură cu faptul că WordPress nu inițializează acestea odată ce șablonul s-a încărcat din cauza exit()?

Adrian Adrian
21 sept. 2020 01:25:53

În continuarea comentariului anterior, am schimbat hook-ul din init în wp_loaded și acum shortcode-urile se încarcă.

Adrian Adrian
21 sept. 2020 01:32:15
0
11

Acțiunea init nu este potrivită pentru ceea ce încerci să realizezi. Ar trebui să folosești filtrul template_include în schimb. Poți combina acest lucru cu get_query_var pentru a prelua parametrii din URL și a verifica ce șablon trebuie încărcat. Iată link-urile:

Cod:

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

Modul WordPress de a face acest lucru este prin utilizarea page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Ai nevoie doar de un cod pentru șablonul WordPress. În tema ta WordPress poți crea un șablon de pagină și să îl redenumești în

page-id.php

Această pagină specifică va prelua automat șablonul și îl va folosi.

De exemplu, dacă pagina ta are ID-ul 5874, vei denumi șablonul page-5784.php

De asemenea, poți denumi șablonul în funcție de slug-ul paginii. De exemplu, dacă slug-ul paginii este hello-world, atunci numele șablonului va fi page-hello-world.php

Vezi și: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

3 apr. 2017 12:52:24
0

@shivanand-sharma aceasta este o metodă perfectă și mai curată (https://developer.wordpress.org/themes/template-files-section/page-template-files/) pentru a crea orice pagină ca oricare alta în WordPress, iar dacă doriți să ascundeți pagina, folosesc un plugin simplu și eficient 'https://wordpress.org/plugins/exclude-pages/'.

Trebuie să spun că aveam nevoie de un URL pentru a face POST sau GET către propria pagină și a salva niște date de sesiune 'WC()->session', iar această soluție rezolvă această problemă și altele, deoarece puteți avea o structură de cod PHP personalizat care include tot 'require('wp-load') etc' din întregul WordPress, WooCommerce etc pentru a lucra prin intermediul mysite.com/index.php/MYPAGINĂ .....

Trebuie doar să :

Primul pas: Creați un fișier în locația temei ca șablon al noii pagini, de exemplu 'wp-content/themes/mytheme/customtemplate.php' (Comentariul este important pentru ca 'Template Name' să fie observat de WordPress) :

<?php /* Template Name: NumeOricare */ 
echo 'Salut Lume';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Al doilea pas: Creați o pagină în WordPress în mod normal prin 'wp-admin' > Pagini (De exemplu un nume ca MYPAGINĂ, sau puteți modifica slug-ul după preferință) și desigur legați șablonul anterior ca șablon al acestei pagini care are numele 'NumeOricare' în secțiunea de atribute ale șablonului.

Deci, haideți să deschidem noua pagină 'mysite.com/index.php/MYPAGINĂ' și veți vedea.

Salut Lume
object(WC_Session_Handler)#880 .....................

Extra: Haideți să creăm funcții JavaScript sau jQuery în coș, finalizare comandă, sau orice vă puteți imagina în interiorul tag-urilor 'script' HTML și să includem cod ca acesta:

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