Загрузка внешнего шаблона страницы и сценария постановки в очередь из плагина вызывает 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' ));
}
}
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' ) );
}
Если у вас уже есть или вы планируете создать страницу под названием "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()
, иначе сценарии, поставленные в очередь, не будут напечатанный.