Verwenden Sie eine Vorlagendatei für eine bestimmte URL, ohne eine Seite zu erstellen

14

Ich frage mich, ob es möglich ist, eine Vorlagendatei für eine bestimmte URL zu verwenden, ohne eine Seite für diese Vorlage erstellen zu müssen.

Das ist mein vereinfachtes Problem:

Ich habe in WP eine Seite mit Linkinhalten erstellt , die auf eine bestimmte URL mit nachfolgenden Formulardaten verweist: (mysite.com/retail/?a=test&b=1234) .

Ich möchte, dass diese URL (Einzelhandel) automatisch meine Vorlagendatei template-retail.php verwendet, die ich im untergeordneten Themenverzeichnis habe, ohne eine Seite mit dem Namen "Einzelhandel" erstellen und die Vorlagenseite von dort auswählen zu müssen. Die Datei template-retail.php enthält nur externen Inhalt, nichts von Wordpress.

Ist das möglich?

Keat
quelle
1
Sie müssen eine HTAccess-Umleitung in die Datei erstellen und die Anforderung dort verarbeiten.
Howdy_McGee
In diesem Fall habe ich keinen Zugriff auf die .htaccess-Datei. Gibt es einen anderen Weg?
Keat
Es gibt Plugins, mit denen Sie möglicherweise auf diese Art von Dingen zugreifen können. Sie müssen jedoch eine benutzerdefinierte Datei auf den Server hochladen, damit sie getroffen werden kann.
Howdy_McGee
4
Nicht sicher über alle Details Ihres Projekts, aber die ersten Dinge, die mir einfallen, sind template_redirectoder ein Endpunkt
s_ha_dum

Antworten:

15

Sie können sich nur die URL ansehen, die Datei laden und beenden.

Dies kann geschehen, wenn WordPress seine Umgebung geladen hat, zB auf '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
     }
  }
});

Beachten Sie, dass eine echte Seite mit dem Zusatz "retail" niemals verwendet werden kann.

Dies ist ziemlich einfach, aber auch hartcodiert. Wenn Sie dies für eine einzelne Seite benötigen, ist dies in Ordnung. Wenn Sie mehr URLs steuern möchten, lesen Sie die in dieser Antwort vorgeschlagene Lösung .

gmazzap
quelle
Danke für deine Antwort. Ich kann den obigen Code nicht zum Laufen bringen. Dies ist niemals wahr: "if ($ url_path === 'retail') {" Der $ url_path ist ein String mit dem Wert: " example.com/retail "
Keat
Versuchen Sie zu var_dump($url_path);sehen, wie es aussieht, und passen Sie den Code an. Dieser Wert hängt von Ihrer tatsächlichen URL ab. ZB für benutzerdefinierte Home-URL oder WP im Unterordner installiert kann unterschiedlich sein. @ Keat
gmazzap
1
Vielen Dank für die Antwort und entschuldigen Sie die verspätete Antwort. Ich habe diese Lösung verwendet und sie funktioniert perfekt. $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/'); $templatename = 'retail'; $pos = strpos($url_path, $templatename); if ($pos !== false) {
Keat
4

Die initAktion ist für das, was Sie erreichen möchten, nicht geeignet. Sie sollten stattdessen den template_includeFilter verwenden. Sie können dies kombinieren get_query_var, um die URL-Parameter abzurufen und zu überprüfen, welche Vorlage geladen werden muss. Hier sind die Links:

Code:

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;
}
Adamj
quelle
1

Der WordPress-Weg dazu ist mit page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Sie benötigen nur einen Code für die WordPress-Vorlage. In Ihrem WordPress-Theme können Sie eine Seitenvorlage erstellen und in umbenennen

page-id.php

Diese bestimmte Seite nimmt sie automatisch auf und verwendet die Vorlage.

Wenn Ihre Seite beispielsweise die ID 5874 hat, wird die Vorlage als benannt page-5784.php

Sie können die Vorlage auch basierend auf dem Seiten-Slug benennen. Wenn beispielsweise der Page Slug ist, lautet hello-worldder Vorlagennamepage-hello-world.php

Siehe auch: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

Shivanand Sharma
quelle
0

@ shivanand-sharma Dies ist die perfekte und sauberere Methode ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ), um jede Seite wie jede andere in WordPress zu erstellen, und wenn Sie möchten Um deine Seite zu verstecken, benutze ich einfach das einfache und effektive Plugin ' https://wordpress.org/plugins/exclude-pages/ '

Ich muss sagen, dass ich eine URL brauchte, um POST oder GET zu meiner eigenen Seite zu machen und einige Sitzungsdaten 'WC () -> session' zu speichern, und dies löst dieses und andere Probleme, weil Sie ein Rückgrat von benutzerdefinierten haben können PHP-Code, einschließlich aller 'require (' wp-load ') etc' der gesamten WordPress-, Woocommerce- usw., um damit zu arbeiten, mysite.com/index.php/MYPAGE .....

Sie müssen nur:

Erstens: Erstellen Sie eine Datei in Ihrem Themenverzeichnis als Vorlage für die neue Seite, etwa "wp-content / themes / mytheme / customtemplate.php" (Kommentar ist wichtig, damit der "Vorlagenname" von Wordpress beobachtet werden kann):

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

Zweitens: Erstellen Sie eine Seite bei WordPress normalerweise über 'wp-admin'> Seiten (sagen wir einen Namen wie MYPAGE , oder Sie können den Slug nach Belieben ändern) und verlinken Sie natürlich die vorherige Vorlage als Vorlage für diese Seite, die Name ist 'WhateverName' im Abschnitt mit den Vorlagenattributen.

Öffnen wir also die neue Seite 'mysite.com/index.php/MYPAGE' und Sie werden sehen.

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

Extras: Lassen Sie uns Javascript- oder jquery-Funktionen im Einkaufswagen erstellen, alles, was Sie sich in HTML-Tags für Skripte vorstellen können, auschecken und Code wie diesen einfügen:

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