WordPress

WordPress REST API nie pozwala mi filtrować według identyfikatora autora, gdy jest wywoływany wewnętrznie, działa zewnętrznie w Postmanie

  • 13 lutego, 2023
  • 3 min read
WordPress REST API nie pozwala mi filtrować według identyfikatora autora, gdy jest wywoływany wewnętrznie, działa zewnętrznie w Postmanie


Obecnie tworzę niestandardowy punkt końcowy interfejsu API dla witryny, którą tworzę, co działa całkowicie dobrze poza tym problemem z identyfikatorami autorów.

Jeśli wykonam żądanie GET do website.local/wp-json/wp/v2/podcasts zwraca prawidłowy JSON wszystkich podcastów typu niestandardowego postu. Jeśli wykonam żądanie GET do website.local/wp-json/wp/v2/podcasts?author=1 To Również zwraca prawidłowy JSON wszystkich podcastów Niestandardowy typ postu – tutaj nie ma problemów.

Problem jednak pochodzi z innego kodu, który piszę, próbuję to zrobić w funkcji niestandardowej:

$server = rest_get_server();
$podcastsRequest = new WP_REST_Request( 'GET', '/wp/v2/podcasts?author=1');
$podcastsResponse = rest_do_request( $podcastsRequest );
$podcastsData = $server->response_to_data( $podcastsResponse, false );

Kiedy uruchamiam go w Postman, otrzymuję następującą odpowiedź:

{
    "code": "rest_no_route",
    "message": "No route was found matching the URL and request method.",
    "data": {
        "status": 404
    }
}

Jeśli wykonam to wywołanie wewnętrznie wewnątrz funkcji, działa dobrze:

$server = rest_get_server();
$podcastsRequest = new WP_REST_Request( 'GET', '/wp/v2/podcasts');
$podcastsResponse = rest_do_request( $podcastsRequest );
$podcastsData = $server->response_to_data( $podcastsResponse, false );

Nie mogę zrozumieć, dlaczego powoduje ten błąd, gdy bezpośrednie wywołanie do niego działa dobrze?

EDYCJA: Aby dać więcej kontekstu, jest to funkcja, której używam:

function get_all_posts(WP_REST_Request $request){
    $server = rest_get_server();

    if($request->get_param('id')){
        // $author = $request->get_param('author');
        $podcastsRequest = new WP_REST_Request( 'GET', '/wp/v2/podcasts?author=1');
        // $articlesRequest = new WP_REST_Request( 'GET', '/wp/v2/articles?author=1');
        // $webinarsRequest = new WP_REST_Request( 'GET', '/wp/v2/webinars?author=1');
        // $expertInterviewsRequest = new WP_REST_Request( 'GET', '/wp/v2/expert-interviews?author=1');
        // $guidesRequest = new WP_REST_Request( 'GET', '/wp/v2/guides?author=1');
    } else {
        $podcastsRequest = new WP_REST_Request( 'GET', '/wp/v2/podcasts' );
        $articlesRequest = new WP_REST_Request( 'GET', '/wp/v2/articles' );
        $webinarsRequest = new WP_REST_Request( 'GET', '/wp/v2/webinars' );
        $expertInterviewsRequest = new WP_REST_Request( 'GET', '/wp/v2/expert-interviews' );
        $guidesRequest = new WP_REST_Request( 'GET', '/wp/v2/guides' );
    }

    $podcastsResponse = rest_do_request( $podcastsRequest );
    $podcastsData = $server->response_to_data( $podcastsResponse, false );


    $articlesResponse = rest_do_request( $articlesRequest );
    $articlesData = $server->response_to_data( $articlesResponse, false );

    $webinarsResponse = rest_do_request( $webinarsRequest );
    $webinarsData = $server->response_to_data( $webinarsResponse, false );

    $expertInterviewsResponse = rest_do_request( $expertInterviewsRequest );
    $expertInterviewsData = $server->response_to_data( $expertInterviewsResponse, false );

    $guidesResponse = rest_do_request( $guidesRequest );
    $guidesData = $server->response_to_data( $guidesResponse, false );

    $merged = array_merge(
        $podcastsData,
        $articlesData,
        $webinarsData,
        $expertInterviewsData,
        $guidesData,
    );

    return $merged;
}

add_action('rest_api_init', function () {
    register_rest_route( 'wp/v2', '/all-posts', [
        'methods'  => 'GET',
        'callback' => 'get_all_posts',
    ]);
});

Jak powiedziałem powyżej, jeśli po prostu użyję new WP_REST_Request( 'GET', '/wp/v2/podcasts' ); punktów końcowych, działa dobrze, ale jeśli spróbuję użyć new WP_REST_Request( 'GET', '/wp/v2/podcasts?author=1' ); zwraca ten błąd, pomimo bezpośredniego wywołania do website.local/wp-json/wp/v2/podcasts?author=1 zwracanie wszystkich postów dla autora.

Warto przeczytać!  Przedstawiamy generator podpisów e-mail — łatwe projektowanie profesjonalnych podpisów e-mail


Źródło