web-dev-qa-db-ja.com

Admin-ajax.phpにいるかどうかを確認するにはどうすればいいですか?

今のところ私のプラグインでは、私はin_admin()を使ってユーザーがサイトのフロントエンドにいるのか、それとも管理者エリアにいるのかを判断しています。ただし、プラグインがadmin-ajax.phpを使用してajax要求を処理するときに問題が発生します。

私はadmin-ajax.phpファイルを処理するとき、またはサイトのフロントエンドでのみフックとプラグインを登録する方法が必要です。それを実行するための最良の方法は何ですか?

26
Extrakun

定数DOING_AJAXを確認してください。その定義はwp-admin/admin-ajax.phpの最初の作業コードです。 Jetpackのように非常に奇妙なプラグインは 予想外の場所でその定数を定義しています そのためis_admin()のチェックも含めるかもしれません。

例:

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}

私は これをチェックするもっと簡単な方法を頼んだ ずっと前に、これは4.7.0でついに実装された。

そのため、WP 4.7以上の場合は、次のものを使用できます。

if ( wp_doing_ajax() )
{
    // do something
}
58
fuxia

良い知らせ、機能は今そこにあります。

File: /wp-includes/load.php
1037: /**
1038:  * Determines whether the current request is a WordPress Ajax request.
1039:  *
1040:  * @since 4.7.0
1041:  *
1042:  * @return bool True if it's a WordPress Ajax request, false otherwise.
1043:  */
1044: function wp_doing_ajax() {
1045:   /**
1046:    * Filters whether the current request is a WordPress Ajax request.
1047:    *
1048:    * @since 4.7.0
1049:    *
1050:    * @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
1051:    */
1052:   return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
1053: }

要約すると、admin-ajax.phpはこのようなものを定義しています。

File: /wp-admin/admin-ajax.php
11: /**
12:  * Executing Ajax process.
13:  *
14:  * @since 2.1.0
15:  */
16: define( 'DOING_AJAX', true );
17: if ( ! defined( 'WP_ADMIN' ) ) {
18:     define( 'WP_ADMIN', true );
19: }
5
prosti

Fuxiasソリューションは、管理パネルからのajaxリクエストに対してもfalseを返します。しかし、これらの要求はtrueを返すはずです。あなたが要求しているデータは管理者ビュー用に提供されているからです。この問題を解決するために、次の関数を使うことができます。

function saveIsAdmin() {
    //Ajax request are always identified as administrative interface page
    //so let's check if we are calling the data for the frontend or backend
    if (wp_doing_ajax()) {
        $adminUrl = get_admin_url();
        //If the referer is an admin url we are requesting the data for the backend
        return (substr($_SERVER['HTTP_REFERER'], 0, strlen($adminUrl)) === $adminUrl);
    }

    //No ajax request just use the normal function
    return is_admin();
}
1
GM_Alex

DOING_AJAX定数は、admin-ajax.phpにいるかどうかをチェックします

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
0
PlanetHackers