Загрузка внешнего шаблона страницы и сценария постановки в очередь из плагина вызывает 403 запрещенную ошибку


У меня есть плагин, который создает панель на следующей странице:

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

Я хочу использовать эту панель на следующей странице

mysite.com/mypanel

Решение, которое я попытался, состояло в том, чтобы использовать mypanel.php в качестве шаблона страницы, как показано ниже:

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

Таким образом, страница отображается, но ни один из javascript не работает. Поэтому я попытался импортировать javascript плагина в функции 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');
    }

}

, что привело к 403 запрещенной ошибке. Я добавил, попытался добавить папку .htaccess на страницу плагина, но он продолжал выдавать ошибку.

Пожалуйста, скажите мне, как правильно решить эту проблему.

РЕДАКТИРОВАТЬ: После некоторых ответов ниже (спасибо всем). Я переместил свои коды на страницу своего плагина, и больше не было 403 запрещенных ошибок. Но мои кнопки не работают, и я чувствую, что мой файл js не работает на странице.

Мой файл js начинается с: jQuery(document).ready(function()

Вот окончательный код на странице плагина:

/* 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' ));        
    }    
}
Author: Fayaz, 2017-03-31

2 answers

Ваш КОД в порядке, причина, по которой вы получаете ошибку 403, заключается в том, что $_SERVER['DOCUMENT_ROOT'] возвращает абсолютный ПУТЬ к корневому каталогу вашего веб-сайта, а не URL.

JavaScript необходимо добавить в качестве URL-адреса. Итак, вы можете использовать функцию Load_Template_Scripts_wpa83855 в своем плагине, а затем использовать:

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

КОД для добавления JavaScript.

Примечание: очевидно, что вы можете сделать КОД еще лучше, используя логику, подобную той, которую @nathan использовал в своем ответе, т.Е. Добавив:

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');

В пределах wpa3396_page_template() функция в блоке условий if ( is_page( 'mypanel' ) ) {}; но это не причина ошибки. Путь к серверу недоступен для браузера, поэтому сервер возвращает ошибку Access Forbidden.

Полный КОД (обновлен):

Вот полный КОД для вашего удобства (добавьте его в свой основной файл плагина):

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' ) );
}
 6
Author: Fayaz, 2020-06-15 08:21:38

Если у вас уже есть или вы планируете создать страницу под названием "mypanel", вы можете использовать фильтр page_template для фильтрации шаблона, используемого на этой странице. Я предполагаю, что именно это вы и делаете.

Мы можем использовать фильтр page_template, чтобы использовать пользовательский шаблон для этой страницы. При использовании этого фильтра мы можем добавить действие для постановки в очередь сценариев, специфичных для этой страницы.

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

В файле шаблона /includes/mypanel.php обязательно вызовите wp_head() и wp_footer(), иначе сценарии, поставленные в очередь, не будут напечатанный.

 1
Author: Nathan Johnson, 2017-04-03 16:05:50