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

14

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.

Voici mon problème simplifié:

J'ai créé une page dans WP avec du contenu de lien qui pointe vers une URL spécifique avec des données de formulaire de fin: (mysite.com/retail/?a=test&b=1234) .

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

Est-ce possible?

Keat
la source
1
Vous devez créer une redirection HTAccess vers le fichier, puis y traiter la demande.
Howdy_McGee
Je n'ai pas accès au fichier .htaccess dans ce cas. Est-ce qu'il y a un autre moyen?
Keat
il existe des plugins qui peuvent vous donner accès à ce type de choses, de toute façon vous devrez télécharger un fichier personnalisé sur le serveur afin qu'il ait quelque chose à frapper.
Howdy_McGee
4
Je ne suis pas sûr de tous les détails de votre projet, mais les premières choses qui me viennent à l'esprit sont template_redirectou un point final
s_ha_dum

Réponses:

16

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 ce faisant, une vraie page avec slug "retail" ne peut jamais être utilisée.

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

gmazzap
la source
Merci pour votre réponse. Je ne parviens pas à faire fonctionner le code ci-dessus. Ce n'est jamais vrai: "if ($ url_path === 'retail') {" Le $ url_path est une chaîne avec la valeur: " example.com/retail "
Keat
Essayez de var_dump($url_path);voir à quoi il ressemble et ajustez le code. Cette valeur dépend de votre véritable URL. Par exemple, pour l'URL d'accueil personnalisée, ou WP installé dans le sous-dossier peut être différent. @Keat
gmazzap
1
Merci pour la réponse et désolé pour la réponse tardive. J'ai utilisé cette solution et cela fonctionne parfaitement. $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' initaction n'est pas adaptée à ce que vous essayez de réaliser. Vous devriez plutôt utiliser le template_includefiltre. Vous combinez cela avec get_query_varpour récupérer les paramètres d'URL pour 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;
}
adamj
la source
2

La façon WordPress de le faire est avec page-templates. https://developer.wordpress.org/themes/template-files-section/page-template-files/

Vous n'avez besoin que 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 particulière la récupérera automatiquement et utilisera le modèle.

Par exemple, si votre page a un identifiant de 5874, vous nommerez le modèle comme 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-worldalors le nom du modèle serapage-hello-world.php

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

Shivanand Sharma
la source
0

@ 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 le souhaitez pour masquer votre page, j'utilise simplement le plugin simple et efficace ' https://wordpress.org/plugins/exclude-pages/ '

Je dois dire que j'avais besoin d'une URL pour créer POST ou GET sur ma propre page et enregistrer certaines données de session 'WC () -> session', et cela résout ce problème et d'autres, car vous pouvez avoir une épine dorsale personnalisée code php comprenant tous les 'require (' wp-load ') etc' de l'intégralité de wordpress, woocommerce etc. avec lesquels travailler, mysite.com/index.php/MYPAGE .....

Il vous suffit de:

Tout d'abord: créez un fichier à l'intérieur de l'emplacement de votre thème comme modèle de la nouvelle page, quelque chose comme '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);
?>

Deuxièmement: Créez une page sur wordpress normalement via 'wp-admin'> Pages (disons un nom comme MYPAGE , ou vous pouvez changer le slug comme vous le souhaitez) et liez bien sûr le modèle précédent comme modèle de cette page qui est le nom «Quel que soit le nom» 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 incluons du code comme ceci:

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