web-dev-qa-db-fra.com

Utiliser un fichier de modèle pour une URL spécifique sans créer de page

Je me demande s'il est possible d'utiliser un fichier de modèle pour une URL spécifique sans avoir à créer une page pour ce modèle.

C'est mon problème simplifié:

J'ai créé une page dans WP avec un contenu de lien pointant vers une URL spécifique avec certaines données de formulaire suivantes: (mysite.com/retail/?a=test&b=1234) .

Je veux que cette URL (détail) utilise automatiquement mon fichier de modèle template-retail.php que j'ai dans le répertoire du thème enfant, sans avoir à créer une page nommée "détail" et à sélectionner la page de modèle à partir de là. Le fichier template-retail.php ne contient que du contenu externe, rien de Wordpress lui-même.

Est-ce possible?

11
Keat

Vous pouvez simplement regarder l'URL, charger le fichier et quitter.

Cela peut être fait lorsque WordPress a chargé son environnement, par exemple sur '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
     }
  }
});

Notez que cela ne peut jamais être utilisé avec real page avec slug "retail".

C'est assez facile, mais aussi codé en dur, donc si vous en avez besoin pour une seule page, c'est très bien. Si vous avez besoin de contrôler plus d’URL, jetez un coup d’œil à la solution proposée dans cette réponse .

12
gmazzap

L’action init ne convient pas à ce que vous essayez d’atteindre. Vous devriez plutôt utiliser le filtre template_include. Vous combinerez ceci avec get_query_var pour récupérer les paramètres d'URL afin de vérifier quel modèle doit être chargé. Voici les liens:

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;
}
4
adamj

Le moyen WordPress pour faire cela est avec page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Vous avez seulement besoin d'un code pour le modèle WordPress. Dans votre thème WordPress, vous pouvez créer un modèle de page et le renommer en

page-id.php

Cette page en particulier le prendra automatiquement et utilisera le modèle.

Par exemple, si votre page a un identifiant de 5874, vous nommerez le modèle par page-5784.php

Vous pouvez également nommer le modèle en fonction du slug de page. Par exemple, si le slug de page est hello-world, le nom du modèle sera donc page-hello-world.php

Voir aussi: - https://developer.wordpress.org/files/2014/10/template-hierarchy.png

1
Shivanand Sharma

@ shivanand-sharma c'est une méthode parfaite et plus propre ( https://developer.wordpress.org/themes/template-files-section/page-template-files/ ) pour créer une page comme une autre dans wordpress, et si vous voulez cacher votre page, j'utilise juste le plugin simple et efficace ' https://wordpress.org/plugins/exclude-pages/ '

Je dois dire que j'avais besoin d'une URL pour créerPOSTouOBTENIRsur ma propre page et enregistrer des données de session 'WC () -> session', et cela résout ce problème ainsi que d’autres, parce que vous pouvez avoir une colonne vertébrale de code php personnalisé comprenant tout le "require (" wp-load "), etc." de l’ensemble du wordpress, du woocommerce, etc mysite.com/index.php/MYPAGE .....

Vous avez juste besoin de:

First: Créez un fichier à l’emplacement de votre thème en tant que modèle de la nouvelle page, par exemple 'wp-content/themes/mytheme/customtemplate.php' (le commentaire est important pour que le 'Nom du modèle' puisse être observé. par Wordpress):

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

Seconde: Créez une page sur wordpress normalement via 'wp-admin'> Pages (disons un nom commeMYPAGE, ou vous pourrez changer le slug comme bon vous semble) et le désactiver Course relie le modèle précédent en tant que modèle de cette page qui est name 'WhateverName' dans la section des attributs du modèle.

Alors ouvrons la nouvelle page 'mysite.com/index.php/MYPAGE' et vous verrez.

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

Extras: Créons des fonctions javascript ou jquery dans le panier, la caisse, tout ce que vous pouvez imaginer à l'intérieur des balises HTML 'script', et incluez un code comme celui-ci:

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