is_rest()のようなものが存在しますか


16

私はREST APIから少し始めています。完全に誤解しない限り、initアクションフックはREST APIリクエストのときにも実行されます。ここで、REST APIリクエストではないコードのみを実行します。

だから私は次のようなことis_rest()をするためのようなコマンドを探していました

<?php
if( ! is_rest() ) echo 'no-rest-request';
?>

しかし、私はこのようなものを見つけることができませんでした。そこにあるis_rest()うちはそこに?


1
たぶん、それがRESTリクエストではないときに何をしたいのかを詳しく説明できますか?リクエストのタイプは、クエリ解析まで決定されませんinit。また、RESTリクエストではないリクエストでAPIの一部を内部で使用できるため、その検出に依存している場合は何かを壊す危険性があります。
ミロ

お二人に感謝します。@birgire:これを回答として投稿できますので、確認できます。基本的に、それは私の質問に対する答えです:)
websupporter

回答:


14

@Miloによる良い点です。REST_REQUEST定数は、if が空でない場合にとして定義されます。truerest_api_loaded()$GLOBALS['wp']->query_vars['rest_route']

それは経由でフックされparse_requestます:

add_action( 'parse_request', 'rest_api_loaded' );

しかし、parse_request火災は、後でよりもinit-例えば、コーデックスを参照してくださいここに

そこチケットで(ダニエルBachhuberによる)の提案だった#34373に関してはWP_Query::is_rest()、それがキャンセル/延期されました。


11

同じ問題につまずいて、is_rest現在のリクエストがWP REST APIリクエストであるかどうかを確認できるシンプルな関数を作成しました。

<?php
if ( !function_exists( 'is_rest' ) ) {
    /**
     * Checks if the current request is a WP REST API request.
     *
     * Case #1: After WP_REST_Request initialisation
     * Case #2: Support "plain" permalink settings
     * Case #3: It can happen that WP_Rewrite is not yet initialized,
     *          so do this (wp-settings.php)
     * Case #4: URL Path begins with wp-json/ (your REST prefix)
     *          Also supports WP installations in subfolders
     *
     * @returns boolean
     * @author matzeeable
     */
    function is_rest() {
        $prefix = rest_get_url_prefix( );
        if (defined('REST_REQUEST') && REST_REQUEST // (#1)
                || isset($_GET['rest_route']) // (#2)
                        && strpos( trim( $_GET['rest_route'], '\\/' ), $prefix , 0 ) === 0)
                return true;
        // (#3)
        global $wp_rewrite;
        if ($wp_rewrite === null) $wp_rewrite = new WP_Rewrite();

        // (#4)
        $rest_url = wp_parse_url( trailingslashit( rest_url( ) ) );
        $current_url = wp_parse_url( add_query_arg( array( ) ) );
        return strpos( $current_url['path'], $rest_url['path'], 0 ) === 0;
    }
}

参照:


4

この問題を解決するために、リクエストされているURIがWordPressサイトのRest API URLに該当する場合、Rest APIリクエストであるという仮定に基づいて、単純なカスタム関数を作成しました。

有効なエンドポイントであるか、認証済みであるかは、この関数が決定するものではありません。質問はこれです:URLはRest APIの潜在的なURLですか?

function isRestUrl() {
    $bIsRest = false;
    if ( function_exists( 'rest_url' ) && !empty( $_SERVER[ 'REQUEST_URI' ] ) ) {
        $sRestUrlBase = get_rest_url( get_current_blog_id(), '/' );
        $sRestPath = trim( parse_url( $sRestUrlBase, PHP_URL_PATH ), '/' );
        $sRequestPath = trim( $_SERVER[ 'REQUEST_URI' ], '/' );
        $bIsRest = ( strpos( $sRequestPath, $sRestPath ) === 0 );
    }
    return $bIsRest;
}

$_SERVER['REQUEST_URI']が適切に設定されていない場合でも、この関数は引き続きを返しfalseます。

URLのハードコーディングはないため、何らかの理由でAPI URLベースを変更した場合、これは適応します。


3

正しくないかもしれませんが、私は

if (strpos($_SERVER[ 'REQUEST_URI' ], '/wp-json/') !== false) {
    // Cool API stuff here
}

これが正しくない場合は、お気軽にお知らせください。最終的に共有するための有用なプラグインスターターを作成しよう:https : //gitlab.com/ripp.io/wordpress/plugin-starter


1
かなりのパーマリンクをアクティブにしないと、これは失敗すると思います。
websupporter

あなたは間違いなく正しいです
チャーリー

[OK]を、それはかなりパーマリンクが必要です...しかし誰がそれを望んでいない!!!?これは私にこれを行う最も安全な方法のようです。他のすべてのソリューションは派手ですが、コードを後のWPバージョンで実行したい場合は時間が経つと...これは私にとって安全な方法のようです!!
アントニーギブス

1

ここには2つのオプションがあります。

  1. REST_REQUESTが定義されているかどうかを確認します。
  2. フックしrest_api_initたい場所にフックしinitます。

0

ここに私が思いついたものがあります:

/**
 * Determines if the current request we are handling is a REST Request.
 * This function can be called even on mu-plugins.
 *
 * You might want to prefix this function name with
 * something more unique to your project.
 *
 * @return bool
 */
function is_rest(): bool {
    $is_cli              = php_sapi_name() === 'cli';
    $permalink_structure = get_option( 'permalink_structure' );
    $rest_prefix         = rest_get_url_prefix();

    if ( ! empty( $permalink_structure ) && ! $is_cli ) {
        /*
         * HTTP request with Pretty Permalinks.
         */
        if ( substr( $_SERVER['REQUEST_URI'], 0, strlen( $rest_prefix ) ) === $rest_prefix ) {
            return true;
        }
    } elseif ( empty( $permalink_structure ) && ! $is_cli ) {
        /*
         * HTTP Requests with Plain Permalinks
         *
         * We can rely on "?rest_route" for plain permalinks, this value don't change:
         * wp/wp-includes/rest-api.php:145
         *
         * All ?rest_route must start with "/":
         * wp/wp-includes/rest-api.php:159
         */
        if ( isset( $_GET['rest_route'] ) && substr( $_GET['rest_route'], 0, 1 ) === '/' ) {
            return true;
        }
    } elseif ( $is_cli ) {
        /*
         * CLI request
         */
        if ( did_action( 'parse_request' ) ) {
            return defined( 'REST_REQUEST' ) && REST_REQUEST;
        } else {
            throw new RuntimeException( "Maybe someone at StackOverflow can help fill this gap of identifying REST requests on CLI before the parse_request action has fired and the REST_REQUEST constant is available?" );
        }
    }

    return false;
}

parse_requestただし、アクションが発生する前にCLIがREST要求を検出するようにする時間はあまりありませんでした。私は提案を受け入れます!

この機能に関するテストをまだ作成していません。この回答を更新します。

-編集

WooCommerceがこれを処理する方法を見つけました。WooCommerceはプレーンパーマリンクを考慮していないようです。

public function is_rest_api_request() {
    if ( empty( $_SERVER['REQUEST_URI'] ) ) {
        return false;
    }

    $rest_prefix         = trailingslashit( rest_get_url_prefix() );
    $is_rest_api_request = ( false !== strpos( $_SERVER['REQUEST_URI'], $rest_prefix ) );

    return apply_filters( 'woocommerce_is_rest_api_request', $is_rest_api_request );
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.