web-dev-qa-db-fra.com

Essayer d'obtenir un post méta personnalisé via l'API JSON Jetpack

J'utilise Jetpack pour Wordpress pour produire une API JSON pour mon type de publication Events custom, qui fonctionne correctement:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100

Cependant, ce CPT inclut également un certain nombre de champs de post-méta générés par Des boîtes à méta personnalisées et des champs pour Wordpress . Ces champs incluent des choses comme:

  • _ecmb_supporting_bands
  • _ecmb_tickets_avail
  • _ecmb_event_agelim

Et par défaut, ces champs ne sont pas retournés par l'API JSON ... J'ai essayé d'exécuter des requêtes telles que:

https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key='_ecmb_supporting_bands'

Ou sans guillemets autour de la clé méta: https://public-api.wordpress.com/rest/v1/sites/MYSITE/posts/?type=events&number=100&meta_key=_ecmb_supporting_bands

Malheureusement cela ne fonctionne pas. Est-ce que quelqu'un sait comment je peux retourner ces champs méta personnalisés dans ma réponse JSON?

4
Jody Heavener

De la documentation:

Selon les documents de l'API JSON JetPack :

Par défaut, toutes les clés de métadonnées sont autorisées dans l'API, tant qu'elles ne sont pas protégées. Toute clé de métadonnées commençant par _ est protégée par défaut. Toutefois, les utilisateurs peuvent accéder aux clés de métadonnées protégées et les modifier à l'aide des fonctionnalités edit_post_meta (utilisées pour l'édition et l'affichage), add_post_meta et delete_post_meta, selon les besoins de chaque opération. Nous avons également ajouté un filtre rest_api_allowed_public_metadata qui vous permet d’inscrire spécifiquement en liste blanche certaines clés de métadonnées auxquelles tout utilisateur peut accéder, même si cette clé est protégée.

le filtre rest_api_allowed_public_metadata est donc ce que vous recherchez.

A partir du code source:

Si vous vérifiez le code source du JetPack, vous trouverez cette partie:

    function is_metadata_public( $key ) {
            if ( empty( $key ) )
                    return false;

            // whitelist of post types that can be accessed
            if ( in_array( $key, apply_filters( 'rest_api_allowed_public_metadata', array() ) ) )
                    return true;

            return false;
    }

dans le fichier class.json-api-endpoints.php.

Vous pouvez également consulter la fonction allow_bbpress_public_metadata()here pour savoir comment implémenter ce filtre rest_api_allowed_public_metadata.

Exemple:

Voici un exemple similaire pour votre cas:

/**
 * Whitelist protected meta keys
 *
 * @param array $allowed_meta_keys 
 * @return array $allowed_meta_keys 
 */
function custom_rest_api_allowed_public_metadata( $allowed_meta_keys )
{
    // only run for REST API requests
    if ( ! defined( 'REST_API_REQUEST' ) || ! REST_API_REQUEST )
        return $allowed_meta_keys;

    $allowed_meta_keys[] = '_ecmb_supporting_bands';
    $allowed_meta_keys[] = '_ecmb_tickets_avail';
    $allowed_meta_keys[] = '_ecmb_event_agelim';

    return $allowed_meta_keys;
}

add_filter( 'rest_api_allowed_public_metadata', 'custom_rest_api_allowed_public_metadata' );

avec la sortie JSON similaire à celle-ci:

"metadata":[{"id":"196711","key":"_ecmb_event_agelim","value":"18"},
            {"id":"196709","key":"_ecmb_supporting_bands","value":"The Rolling Stones"}, 
            {"id":"196710","key":"_ecmb_tickets_avail","value":"5500"}]
3
birgire

En plus de @birgire reply, placer le code de filtre quelque part peut être délicat:

  • Si vous le placez dans le fichier "functions.php" de votre thème, une mise à jour du thème pourrait écraser votre code.
  • Écrire un plugin pour ajouter un filtre, c'est beaucoup de fuzz

C'est pourquoi j'ai utilisé le plug-in suivant qui vous permet d'écrire vos actions et filtres personnalisés dans le panneau d'administration Wordpress sans avoir à vous soucier de le perdre. http://wordpress.org/plugins/add-actions-and-filters/ .

J'ai eu le même problème que vous et après avoir inclus le filtre, cela fonctionne maintenant comme un charme.