web-dev-qa-db-fra.com

WordPress REST API - Modifier le JSON avant d'importer

Salut les gars, j'ai des données qui me parviennent WP d'une société externe à/wp-json/wp/v2/jobs/à importer en tant que publication.

Ces données contiennent des fichiers JSON qui doivent être importés. Cependant, ils ont essayé de définir des taxonomies à l'aide de chaînes, par exemple. "Manager" plutôt que le term_id qui serait "381". Cela signifie que je reçois une erreur renvoyée.

{
    "code": "rest_invalid_param",
    "message": "Invalid parameter(s): job_location, job_industry, job_sector",
    "data": {
        "status": 400,
        "params": {
            "job_location": "job_location[0] is not of type integer.",
            "job_industry": "job_industry[0] is not of type integer.",
            "job_sector": "job_sector[0] is not of type integer."
        }
    }
}

Donc, ce que je veux, c'est quand ils nous envoient cette valeur, par exemple:

"job_sector": "Manager"

Je veux plutôt parcourir nos taxonomies et trouver l'ID de ce secteur "gestionnaire", reconstruire le JSON etPUISavoir WP importer les données que je transmets, sans erreur avec le code approprié ID.

Quelqu'un peut-il m'aider à intercepter le JSON et à le transmettre au format approprié?

J'ai essayé "rest_pre_dispatch" mais cela semble être uniquement l'édition du résultat qui leur est renvoyé, cela a déjà été traité par WP.

EDIT: Voici mon code:

 function wpse281916_rest_check_referer( $result, $server, $request ) {
     if ( null !== $result ) {
         // Core starts with a null value.
         // If it is no longer null, another callback has claimed this request.
         // Up to you how to handle - for this example we will just return early.
         return $result;
     }

     $array = json_decode($result, true);
     $term = get_term_by('name',$array["job_sector"],'job_sector');
     $term = json_decode(json_encode($term),true);
     $termid = $term['term_id'];   
     $array['job_sector'] = $termid;
     $result = json_encode($array);
     return $result;
 }

// add the filter
add_filter( 'rest_pre_dispatch', 'wpse281916_rest_check_referer', 10, 3 );

EDIT2: Après suggestion

    function wpse281916_rest_check_referer( $result, $server, $request ) {
        if ( null !== $result ) {
            // Core starts with a null value.
            // If it is no longer null, another callback has claimed this request.
            // Up to you how to handle - for this example we will just return early.
            return $result;
        }

        $array = json_decode($request, true);
        $term = get_term_by('name',$array["job_sector"],'job_sector');
        $term = json_decode(json_encode($term),true);
        $termid = $term['term_id'];
        $array['job_sector'] = $termid;
        $request = json_encode($array);
        return null;
    }

   // add the filter
   add_filter( 'rest_pre_dispatch', 'wpse281916_rest_check_referer', 10, 3 );
1
KiwisTasteGood

L'utilisation du hook rest_pre_dispatch est probablement la solution la plus simple, mais vous devez faire attention de ne pas remettre correctement vos nouvelles données de requête dans l'objet WP_REST_Request.

Vous réaffectiez l'objet WP_REST_Request à un tableau de données de demande. Ces modifications ne sont pas conservées car le paramètre n'est pas transmis par référence. Au lieu de cela, vous souhaitez modifier l'objet WP_REST_Request.

Vous pouvez affecter un paramètre à l'objet de requête en utilisant une syntaxe de type tableau ou en utilisant WP_REST_Request::set_param( $param_name, $param_value ).

Vous devez également vérifier que vous n'exécutez ce code que sur le bon itinéraire. Je voudrais également déplacer la priorité pour tirer le crochet plus tôt puisque vous dites essentiellement que ce changement devrait s'appliquer à tout ce qui se passe sur cette demande.

function wpse281916_rest_check_referer( $result, $server, $request ) {

    if ( '/wp/v2/jobs' !== $request->get_route() || 'POST' !== $request->get_method()) {
        return $result;
    }

    $job_sector = $request['job_sector'];

    if ( null === $job_sector ) {
        return $result;
    }

    $term = get_term_by( 'name', $job_sector, 'job_sector' );

    if ( $term && ! is_wp_error( $term ) ) {
        $request['job_sector'] = $term->term_id;
    } else {
        $request['job_sector'] = 0;
    }

    return $result;
}

// add the filter
add_filter( 'rest_pre_dispatch', 'wpse281916_rest_check_referer', 0, 3 );
1
Timothy Jacobs

On dirait que vous cherchez le rest_pre_dispatch hook.

Ce hook permet de pirater la demande avant son expédition en renvoyant un non-vide. La valeur renvoyée sera utilisée pour servir la demande à la place.

De la docs:

$result

(mixed) Response to replace the requested version with. Can be anything a normal endpoint can return, or null to not Hijack the request.

On dirait que vous devez modifier la requête $ request et renvoyer null afin de ne pas détourner la réponse par défaut.

2
BenB