web-dev-qa-db-fra.com

WP REST API - Comment changer le code d'état de la réponse HTTP?

J'ai un point de terminaison personnalisé où je veux changer le statut de réponse HTTP à 404 dans certains scénarios (par exemple, la publication n'existe pas). Comment puis je faire ça? Voici un exemple de point de terminaison personnalisé:

function af_news_single( \WP_REST_Request $data ) {
    global $wpdb;

    $year = (int) $data['year'];
    $month = (int) $data['month'];
    $day = (int) $data['day'];
    $slug = $data['slug'];

    $date = "{$year}-{$month}-{$day}";

    $news = $wpdb->get_row(
        $wpdb->prepare(
            "SELECT
                DATE_FORMAT(post_date, %s) as `post_date`,
                `post_title`,
                `post_name`,
                `post_content`
             FROM {$wpdb->posts}
             WHERE
                `post_status` = 'publish' AND
                `post_type` = 'post' AND
                `post_name` = %s AND
                `post_date` BETWEEN %s AND %s + INTERVAL 1 DAY
             LIMIT 1
             ", '%Y-%m-%dT%TZ', $slug, $date, $date
        )
    );

    if ( $news ) {
        $news->post_title = qtranxf_translate( $news->post_title );
        $news->post_content = wpautop( qtranxf_translate( $news->post_content ) );
    } else { /* How to change response code? */ }

    return [ 'data' => $news ];
}

Comment puis-je changer le code de réponse dans cette fonction?

2
Gasim

Vous pouvez renvoyer un objet WP_Error dans lequel vous définissez le code d'état. Voici un extrait de le REST documentation de l'API :

function my_awesome_func( $data ) {
    $posts = get_posts( array(
        'author' => $data['id'],
    ) );

    if ( empty( $posts ) ) {
        return new WP_Error( 'awesome_no_author', 'Invalid author', array( 'status' => 404 ) );
    }

    return $posts[0]->post_title;
}

Dans votre cas, vous pourriez faire quelque chose comme:

return new WP_Error( 'page_does_not_exist', __('The page you are looking for does not exist'), array( 'status' => 404 ) );
5
RRikesh

Le moyen le plus simple est de faire ceci:

return new WP_REST_Response(null, 404);

Remarque: il s'agit toujours d'une réponse JSON contenant null en tant que corps. Vous devrez vous connecter aux filtres de sortie restants et le changer en text/plain ou quelque chose pour ne rien produire.

0
Walf