Użyj pliku szablonu dla określonego adresu URL bez tworzenia strony

14

Zastanawiam się, czy można użyć pliku szablonu dla określonego adresu URL bez konieczności tworzenia strony dla tego szablonu.

To mój uproszczony problem:

Utworzyłem stronę w WP z pewną zawartością linku, która wskazuje na konkretny adres URL z danymi końcowymi: (mysite.com/retail/?a=test&b=1234) .

Chcę, aby ten adres URL (sprzedaż detaliczna) automatycznie używał mojego pliku szablonu template-retail.php, który mam w katalogu motywów podrzędnych, bez konieczności tworzenia strony o nazwie „sprzedaż detaliczna” i wybrania z niej strony szablonu. W pliku template-retail.php jest tylko zewnętrzna zawartość, nic z samego Wordpress.

czy to możliwe?

Keat
źródło
1
Musisz utworzyć przekierowanie HTAccess do pliku, a następnie przetworzyć tam żądanie.
Howdy_McGee
W tym przypadku nie mam dostępu do pliku .htaccess. Czy jest jakiś inny sposób?
Keat
istnieją wtyczki, które mogą dać ci dostęp do robienia tego typu rzeczy, tak czy inaczej musisz przesłać niestandardowy plik na serwer, aby miał coś do trafienia.
Howdy_McGee
4
Nie jestem pewien wszystkich szczegółów swojego projektu, ale z pierwszych rzeczy, które przychodzą na myśl są template_redirectlub punktu końcowego
s_ha_dum

Odpowiedzi:

16

Możesz po prostu spojrzeć na adres URL, załadować plik i wyjść.

Można to zrobić, gdy WordPress załadował swoje środowisko, np 'init'. Na .

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
     }
  }
});

Pamiętaj, że w ten sposób nigdy nie można użyć prawdziwej strony z informacją o reklamie „sprzedaż detaliczna”.

Jest to dość łatwe, ale także zakodowane na stałe, więc jeśli potrzebujesz tego na jednej stronie, jest w porządku. Jeśli chcesz kontrolować więcej adresów URL, zapoznaj się z rozwiązaniem zaproponowanym w tej odpowiedzi .

gmazzap
źródło
Dzięki za odpowiedź. Nie mogę uruchomić powyższego kodu do działania. To nigdy nie jest prawdą: „if ($ url_path === 'retail') {” $ url_path jest ciągiem o wartości: „ example.com/retail
Keat
Spróbuj var_dump($url_path);i zobacz, jak to wygląda, i dostosuj kod. Ta wartość zależy od Twojego prawdziwego adresu URL. Np. Niestandardowy domowy adres URL lub WP zainstalowany w podfolderze może być inny. @Keat
gmazzap
1
Dziękuję za odpowiedź i przepraszam za spóźnioną odpowiedź. Użyłem tego rozwiązania i działa idealnie. $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {
Keat,
5

initAkcja nie jest odpowiedni do tego, co starasz się osiągnąć. Zamiast tego powinieneś użyć template_includefiltra. Połączysz to z, get_query_varaby pobrać parametry adresu URL i sprawdzić, który szablon należy załadować. Oto linki:

Kod:

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;
}
Adam
źródło
2

Można to zrobić za pomocą WordPressa page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Potrzebujesz tylko kodu dla szablonu WordPress. W motywie WordPress możesz utworzyć szablon strony i zmienić jego nazwę na

page-id.php

Ta konkretna strona automatycznie ją podniesie i użyje szablonu.

Na przykład, jeśli twoja strona ma identyfikator 5874, nazwij szablon jako page-5784.php

Możesz także nazwać szablon na podstawie informacji o stronie. Na przykład, jeśli slug strony jest, hello-worldto nazwa szablonu topage-hello-world.php

Zobacz także: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

Shivanand Sharma
źródło
0

@ shivanand-sharma jest to doskonała i czystsza metoda ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ), aby utworzyć dowolną stronę jak każda inna w Wordpress, a jeśli chcesz aby ukryć twoją stronę, po prostu używam prostej i skutecznej wtyczki „ https://wordpress.org/plugins/exclude-pages/

Muszę powiedzieć, że potrzebowałem adresu URL, aby utworzyć POST lub GET na mojej stronie i zapisać niektóre dane sesji „WC () -> session”, a to rozwiązuje ten i inne problemy, ponieważ możesz mieć kręgosłup niestandardowy kod php zawierający wszystkie „wymagania (wp-load”) itp. całego WordPressa, woocommerce itp. do pracy za pośrednictwem, mysite.com/index.php/MYPAGE .....

Musisz tylko:

Po pierwsze: utwórz plik w lokalizacji motywu jako szablon nowej strony, na przykład „wp-content / themes / mytheme / customtemplate.php” (Komentarz jest ważny, aby Wordpress mógł obserwować „Nazwa szablonu”):

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

Po drugie: Stwórz stronę w wordpress normalnie poprzez 'wp-admin'> Strony (Powiedzmy, że nazwa to MYPAGE lub możesz zmienić ślimak, jak chcesz) i oczywiście połącz poprzedni szablon jako szablon tej strony, która jest nazwą „WhthingName” w sekcji atrybutów szablonu.

Więc otwórzmy nową stronę „mysite.com/index.php/MYPAGE”, a zobaczysz.

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

Dodatki: Stwórzmy funkcje javascript lub jquery w koszyku, w kasie, cokolwiek możesz sobie wyobrazić wewnątrz „skryptowych” tagów HTML i dołącz kod w następujący sposób:

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
Jose Velandia
źródło