从插件加载外部页面模板和入队脚本导致403禁止错误

时间:2017-03-31 作者:HOY

我有一个插件,可以在下面的页面上创建一个面板:

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都不起作用。所以我尝试在php函数中导入插件的javascript。

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文件夹进入插件的页面,但它继续给出错误。

请告诉我解决这个问题的正确方法是什么。

EDIT: 以下是一些答案(谢谢大家)。我将代码移动到插件页面,不再出现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 个回复
最合适的回答,由SO网友:Fayaz 整理而成

您的代码很好,出现403错误的原因是$_SERVER[\'DOCUMENT_ROOT\'] 返回web根目录的绝对路径,而不是URL。

JavaScript需要添加为URL。因此,您可以使用Load_Template_Scripts_wpa83855 函数,然后使用:

wp_enqueue_script( \'wtd\', plugins_url( \'/js/wtd.js\' , __FILE__ ) );
添加JavaScript的代码。

Note:@nathan used in his answer, i、 e.添加:

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\' ) );
}

SO网友:Nathan Johnson

如果您已经有或计划有一个名为“mypanel”的页面,那么您可以使用page_template filter可筛选该页面上使用的模板。我想你就是这么做的。

我们可以使用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() 否则,将不会打印排队的脚本。