İs_rest () gibi bir şey var mı


18

Biraz REST API ile başlıyorum. Ben tamamen yanıltıcı değilse, initeylem kanca da bir REST API isteği yürütülür. Şimdi, REST API isteği olmadığında sadece bazı kodları yürütmek istiyorum.

Yani ben is_rest()böyle bir şey yapmak için bir komut arıyordum

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

Ama böyle bir şey bulamadım. Orada bir is_rest()çıkış var mı?


1
Belki bir REST isteği olmadığında ne yapmak istediğiniz hakkında ayrıntılı bilgi verebilirsiniz? İstek türü, sonradan gerçekleşen sorgu ayrıştırma işlemine kadar belirlenmez init. Ayrıca, API bölümlerinin REST istekleri olmayan isteklerde dahili olarak kullanılabileceğine dikkat edin, bu nedenle bu algılamaya güveniyorsanız bir şeyi kırma riskiniz vardır.
Milo

İkinize de çok teşekkürler. @birgire: Bunu cevap olarak gönderebilir misin, böylece kontrol edebilirim. Temel olarak, sorumun cevabı :)
websupporter

Yanıtlar:


14

Bu @Milo tarafından iyi bir nokta REST_REQUESTsabit olduğu belirlenen şekilde truedahilinde, rest_api_loaded()eğer $GLOBALS['wp']->query_vars['rest_route']olmayan boş.

Bu oluyor bağladım içine parse_requestyoluyla:

add_action( 'parse_request', 'rest_api_loaded' );

ancak parse_requestdaha sonra patlar init- Örneğin, burada Kodeks'e bakın .

Orada bilet içinde (Daniel Bachhuber tarafından) bir öneriydi # 34373 ilgili WP_Query::is_rest(), ama iptal / ertelendi.


# 42061 ekleyebilir wp_is_rest_request()veya wp_doing_rest().
Ian Dunn

11

Sadece aynı sorun üzerinde tökezledi is_restve mevcut isteğin bir WP REST API isteği olup olmadığını kontrol etmenizi sağlayan basit bir işlev yazdı .

<?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;
    }
}

Referanslar:


4

Bu sorunu çözmek için, istenen URI'nin WordPress sitesinin Rest API URL'sinin altına düştüğü varsayımına dayanarak basit bir özel işlev yazdım, o zaman bunun bir Rest API isteği olduğunu izler.

Geçerli bir son nokta veya kimliği doğrulanmış olsun, bu işlevin belirlenmesi gerekmez. Soru şudur: URL potansiyel bir Rest API URL'si midir?

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

Senin Eğer $_SERVER['REQUEST_URI']is düzgün doldurulan değil, bu işlev hala dönecektir falsebakmaksızın,.

URL'nin sabit kodlaması yoktur, bu nedenle herhangi bir nedenle API URL tabanınızı değiştirirseniz, bu uyarlanır.


3

Belki doğru değil, ama sonunda

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

Bunun doğru olup olmadığını bana bildirmekten çekinmeyin. Sonunda paylaşmak için yararlı bir eklenti başlatıcısı yapmaya çalışmak: https://gitlab.com/ripp.io/wordpress/plugin-starter


1
Bence, kalıcı permalarınız aktif olmasaydı, bu başarısız olurdu.
websupporter

Kesinlikle
Charly

Tamam oldukça permalink gerektirir ... ama kim istemiyor !!!? Bu bana bunu yapmanın en güvenli yolu gibi görünüyor. Diğer tüm çözümler fantezi ama zaman içinde kodunuzu hala wp sürümlerinde çalıştırmak istiyorsanız ... Bu bana güvenli bir yol gibi görünüyor !!
Antony Gibbs

1

Burada gerçekten iki seçenek var,

  1. REST_REQUESTTanımlanıp tanımlanmadığını kontrol edin .
  2. Takmak rest_api_initistediğiniz yere asın init.

0

İşte ben geldim:

/**
 * 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_requestYine de , eylem başlatılmadan önce CLI'nin REST isteklerini algılamasını sağlamak için fazla zamanım olmadı . Önerilere açığım!

Bu özelliğin etrafına henüz bazı testler yazmadım, bu cevabı yaptıktan sonra güncelleyeceğim.

-- Düzenle

WooCommerce'ın bunu nasıl ele aldığını öğrendim. WooCommerce, düz kalıcı bağlantıları hesaba katmıyor gibi görünüyor:

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 );
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.