web-dev-qa-db-ja.com

フロントエンドスクリプトからadmin-ajax.phpを使用するとis_admin()がtrueを返す

フロントエンドスクリプトからadmin-ajax.phpを使用していた今日の状況がありました。私が理解しているように、これはajax呼び出しをするためのwp方法です(wp_ajax_nopriv_myfunctionフックで私の関数を登録する)

Admin-ajax.phpが管理者側にあるので、is_admin()はtrueを返しますが、私のスクリプトはフロントエンド側からそれを呼び出します。

これは私が使っているプラ​​グインに問題を引き起こします。

だから私は私が何か悪いことをしているのかと思っていました

フロントエンドでAjaxを使用してWPを使用し、is_admin()でfalseを返す方法はありますか。

私が自分自身を理解させることができればいいのに

7
Thomas

WordPressはすべてのajaxリクエスト(フロントエンドまたは管理者側)に対してis_admin()をtrueに設定します。 ( codex を参照)。

これを乗り越える必要はありません(そして、とにかくあなたはそうすべきではありません)。 ajaxリクエストがフロントエンドと管理者の両方の側から発せられる場合は、データを投稿するときにそれが「管理者」かどうかを含めることをお勧めします。しかし、それがあなたのプラグインで引き起こす「問題」についての詳細がなければ、それは面倒な仕事を提供するのは難しいです。

5
Stephen Harris

私はダッシュボードのメニューボタンを使ってフロントエンドと管理者のログを有効/無効にしたかった。私は単にメニューボタンにクラスを追加してからjQueryで管理ページのステータスを問い合わせました

https://codex.wordpress.org/Class_Reference/WP_Admin_Bar/add_menu

クラスとして管理ステータスを持つメニュー項目を追加します

$wp_admin_bar -> add_menu(
  array(
        'title'     => '<span class="ab-icon"></span><span class="ab-label">' . __( 'Console Logging' , 'console-logging' ) . '</span>',
        'id'        => 'your-custom-id',
        'parent'    => false,
        'href'      => '',
        'meta'      => array('class' => 'is-admin-'.is_admin())//GET ACTUAL ADMIN OR NOT in php before page load
));

JavascriptのjQueryを使ってメニュー項目を取得して使用します。

 //'is-admin-1' when is_admin() is true
 //'is-admin-0' when is_admin() is false

var is_admin = $('#wp-admin-bar-your-custom-id').hasClass('is-admin-1');

if(is_admin){
    //You are actually on an admin page
}else{
    //You are on a front end page
}
0
Chris Sprague

私はこれが古いことを知っています、しかしそれがこれを越えてつまずく他の誰かを助けるならば...

私が通常することは、入ってくる要求がajaxであることを示すために私のフロントエンドフォームにある種のフラグを設定することです。

<input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" />

最初は、これは "false"に設定されています。それから、私はajaxの処理を開始しながら "true"に切り替えます。

$('#my_ajax_flag').val('true'); // example using jQuery

それから私のコードの管理者側で、私はそのパラメータをチェックし、そして私のajaxフックを含めるか、私の通常の非ajax管理のものを実行します。だから、例えば:

if ( isset( $_REQUEST['my_ajax_flag'] ) && $_REQUEST['my_ajax_flag'] == 'true' ) {
    add_action('wp_ajax_my_ajax_function', 'my_ajax_function');     
    add_action('wp_ajax_no_priv_my_ajax_function', 'my_ajax_function');
} else {
    // regular non-ajax stuff
}

あなたが何をする必要があるかによって、このアイデアには複数のバリエーションがありますが、それはあなたがajaxリクエストを実行している間あなたの通常の管理者コードが干渉したり発火するのを防ぐことを可能にします。

便利なもう1つの推奨事項は、フォームにWordPressの "noheader"属性を設定することです。

<input type="hidden" name="noheader" value="true" />

最終的にリダイレクトにつながるバックエンド処理を行うとき(恐ろしい二重フォームの送信を避けるために推奨されます)、 "ヘッダが既に送信された"後に通常起こるwpフックにアクセスする必要があるまれなケースで。

0
br3nt