web-dev-qa-db-ja.com

プラグインから外部ページのテンプレートをロードしてスクリプトをエンキューすると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' ));        
    }    
}
7
HOY

あなたのCODEは問題ありません、あなたが403エラーを得ている理由は$_SERVER['DOCUMENT_ROOT']がURLではなくあなたのWebルートへの絶対パスを返すからです。

JavaScriptをURLとして追加する必要があります。それで、あなたはあなたのプラグインの中でLoad_Template_Scripts_wpa83855関数を使って、そして次に使うことができます:

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

JavaScriptを追加するためのコード。

注:明らかに、 @nathanが彼の答えで使用したもの のようなロジックを使用してCODEをさらに良くすることができます。

add_action('wp_enqueue_scripts','Load_Template_Scripts_wpa83855');

wpa3396_page_template()条件ブロック内のif ( is_page( 'mypanel' ) ) {}関数内。しかし、それがエラーの原因ではありません。サーバーのPATHにブラウザからアクセスできない、サーバーがAccess Forbiddenエラーを返すのはそのためです。

フルコード(更新):

これはあなたの便宜のための完全なCODEです(あなたのメインプラグインファイルにそれを追加してください):

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

'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
Nathan Johnson