web-dev-qa-db-fra.com

Le chargement du modèle de page externe et du script de mise en file d'attente à partir du plug-in provoque une erreur 403 interdite

J'ai un plugin qui crée un panneau sur la page suivante:

mysite.com/wp-content/plugins/myplugin/includes/mypanel.php

Je veux utiliser ce panneau à la page suivante

mysite.com/mypanel

La solution que j'ai essayée était d'utiliser mypanel.php comme modèle de page comme ci-dessous:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'mypanel' ) ) {
        $page_template = dirname( __FILE__ ) . '/includes/mypanel.php';
    }
    return $page_template;
}

De cette façon, la page s'affiche mais aucun des scripts javascript ne fonctionne. J'ai donc essayé d'importer le javascript du plugin dans les fonctions php.

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');
function Load_Template_Scripts_wpa83855(){

    if ( strpos(get_page_template(), 'mypanel.php') !== false ) {
        wp_enqueue_script('wtd', $_SERVER['DOCUMENT_ROOT'].'/wp-content/plugins/myplugin/js/wtd.js');
    }

}

Ce qui a entraîné 403 erreur interdite. J'ai ajouté essayé d'ajouter un dossier .htaccess dans la page du plugin mais cela continuait à donner une erreur.

S'il vous plaît dites-moi quelle est la bonne façon de résoudre ce problème.

EDIT: Après quelques réponses ci-dessous (merci à tous). J'ai déplacé mes codes sur la page de mon plugin, et plus d'erreur 403 interdite. Mais mes boutons ne fonctionnent pas et j’ai l’impression que mon fichier js ne fonctionne pas sur la page.

Mon fichier js commence par: jQuery(document).ready(function()

Voici le code final sur la page du plugin:

/* Make tisort-tasarla page as template */
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'tisort-tasarla' ) ) {
        $page_template = dirname( __FILE__ ) . '/includes/tshirt-designer-design-template.php';
    }
    return $page_template;
}
/* Add Javascript to T-Shirt Design Page */

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');
function Load_Template_Scripts_wpa83855(){

    if ( is_page( 'tisort-tasarla' ) ) {
        wp_enqueue_script( 'wtd', plugins_url( '/js/wtd.js' , __FILE__ ), array( 'jquery' ));        
    }    
}
7
HOY

Votre code est correct, la raison pour laquelle vous obtenez une erreur 403 est que $_SERVER['DOCUMENT_ROOT'] renvoie le chemin absolu PATH à votre racine Web, et non pas une URL.

JavaScript doit être ajouté en tant qu'URL. Donc, vous pouvez utiliser la fonction Load_Template_Scripts_wpa83855 dans votre plugin puis utiliser:

wp_enqueue_script( 'wtd', plugins_url( '/js/wtd.js' , __FILE__ ) );

CODE pour ajouter du JavaScript.

Note:vous pouvez évidemment améliorer le code en utilisant une logique semblable à celle utilisée par @nathan dans sa réponse , c’est-à-dire en ajoutant:

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');

dans la fonction wpa3396_page_template() dans le bloc de conditions if ( is_page( 'mypanel' ) ) {}; mais ce n'est pas la raison de l'erreur. Le navigateur ne permet pas d'accéder au serveur PATH, c'est pourquoi le serveur renvoie l'erreur Access Forbidden.

Code complet (mis à jour):

Voici le code complet à votre convenance (ajoutez-le dans votre fichier de plugin principal):

add_filter( 'page_template', 'wpse_262042_page_template' );
function wpse_262042_page_template( $page_template ) {
    if( is_page( 'mypanel' ) ) {
        add_action( 'wp_enqueue_scripts', 'wpse_262042_enqueue_scripts' );
        $page_template = plugin_dir_path( __FILE__ ) . 'includes/mypanel.php';
    }
    return $page_template;
}

function wpse_262042_enqueue_scripts() {
    wp_enqueue_script( 'wtd', plugins_url( 'js/wtd.js' , __FILE__ ), array( 'jquery' ) );
}
5
Fayaz

Si vous avez déjà, ou prévoyez, une page appelée "mypanel", vous pouvez utiliser le filtre page_template pour filtrer le modèle utilisé sur cette page. Je suppose que c'est ce que vous faites.

Nous pouvons utiliser le filtre page_template pour utiliser un modèle personnalisé pour cette page. Lors de l'utilisation de ce filtre, nous pouvons ajouter une action pour mettre en file d'attente les scripts spécifiques à cette page.

add_filter( 'page_template', 'wpse_262042_page_template', 10, 1 );
function wpse_262042_page_template( $page_template ) {
  if( is_page( 'mypanel' ) ) {
    add_action( 'wp_enqueue_scripts', 'wpse_262042_enqueue_scripts' );
    $page_template = plugin_dir_path( __FILE__ ) . 'includes/mypanel.php';
  }
  return $page_template;
}
function wpse_262042_enqueue_scripts() {
  wp_enqueue_script( 'wpse-262042', plugins_url( '/js/wpse-262042.js', __FILE__ ) );
}

Dans le fichier modèle /includes/mypanel.php, veillez à appeler wp_head() et wp_footer(), sinon les scripts mis en file d'attente ne seront pas imprimés.

1
Nathan Johnson