admin-ajax.phpにいるかどうかを確認する方法は?


27

現在、私のプラグインでin_admin()は、ユーザーがサイトのフロントエンドにいるのか、管理領域にいるのかを判断するために使用しています。ただし、プラグインがadmin-ajax.phpajaxリクエストの処理に使用する場合に問題が発生します。

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

回答:


61

定数を確認してください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
}

4
if ( defined( 'DOING_AJAX' ) )それだけで十分です。定数は設定されるだけなadmin-ajax.phpので、値をチェックする必要はありません。
ジョンリード14年

5
@JohnReidこれはグローバル定数であり、誰でもを含む任意の値に設定できますFALSE
FUXIA

いい視点ね。WPコアにはこの値を設定する場所はありませんが、不正なプラグインがfalse代わりに設定しない可能性があるという意味ではないと思います。+1
ジョンリード14

1
それはコーデックスの方法ですが、実際にはテーマにそのフラグを設定する人々を見たので、このソリューションはajaxのように振る舞うべきかどうかを知りたい場合は良いですが、実際に知っている必要がある場合は最善ではないかもしれませんこれはajaxリクエストです。
マークカプルン

5

嬉しいことに、機能は現在あります。

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: }

更新していただきありがとうございます!4.7リリースノートの1つを見逃しました。
トム・オージェ

@TomAugerさん、こんにちは。この関数は、ajaxのMichael Jordanです。おかげで23
prosti

1

Fuxiasソリューションはfalse、管理パネルから行われたajaxリクエストに対しても返されます。ただし、リクエストして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();
}

0

DOING_AJAX あなたがいる場合は常にチェック admin-ajax.php

if ( is_admin() && defined( 'DOING_AJAX' ) && DOING_AJAX )
{
    // do something
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.