Je construis un site avec WP-API (v2). J'essaie d'ajouter un champ REST conformément à la documentation , qui comprend tout ce qui précède body_class
.
Cependant, body_class
renvoie soit une classe (une ajoutée par mon thème), soit aucune classe (lorsque la condition dans le thème qui ajoute la classe est faux).
Voici le code approprié dans mon fichier api.php
(inclus via functions.php
).
// Obtain body classes
function bsd_get_body_class( $data, $object, $request ) {
$classes = get_body_class();
return $classes;
}
// Obtain post classes
function bsd_get_post_classes( $data, $post, $request ) {
return get_post_class();
}
function bsd_rest_fields() {
register_rest_field(['page', 'post'], 'body-class', array(
'get_callback' => 'bsd_get_body_class'
)
);
register_rest_field(['post'], 'post-classes', array(
'get_callback' => 'bsd_get_post_classes'
)
);
}
add_action( 'rest_api_init', 'bsd_rest_fields', 15 );
La fonction post_classes
fonctionne parfaitement et je peux accéder à ces données dans mon état; le body_classes
ne le fait cependant pas.
Utiliser body_class
dans d'autres fichiers de thème fonctionne bien - les classes de corps sont appliquées, par exemple, aux modèles de page.
Il est intéressant de noter que faire print_r(get_body_class())
dans mon fichier functions.php
renvoie également une classe (ou zéro), mais dans un fichier de modèle, cela fonctionne correctement.
get_body_class()
s'appuie sur $wp_query
pour faire son travail, ce qui est apparemment une solution pour l'API JSON.
J'ai envisagé de créer un objet global pour contenir la classe body et de ne l'utiliser que pour maintenir le body_class
à jour ... mais cela ne fonctionnerait pas sans rechargements de page, et rien ne garantissait que l'objet était à jour. rendez-vous amoureux.
Le seul moyen de le faire fonctionner à distance était de détourner l'objet principal $wp_query
, qui est un no-no.
Le code semi-fonctionnel ressemblait à quelque chose comme:
function bsd_get_body_class($id) {
global $wp_query;
$wp_query = $orig_query;
$new_query = new WP_Query( array( 'p' => $id, 'post_type' => 'any' ) );
$wp_query = $new_query;
$classes = get_body_class();
wp_reset_postdata();
$wp_query = $old_query;
return $classes;
}
// Add $classes as a REST field to the API according to docs
Même dans ce cas, cependant, $classes
ne correspond pas nécessairement à la sortie de body_class()
dans mes fichiers de modèle, je pense que cela s’est passé plus tôt dans la requête que dans les modèles.
Alors je l'ai abandonné.
J'ai fini par écrire un constructeur de classes simple dans JS qui recrée certaines fonctionnalités de WP, au lieu d'utiliser l'API et de stocker les classes dans l'état de mon application. Cela ressemble à ceci:
export const bodyClass = (data) => {
var classes = [];
if (data['id'] && data['type'])
classes.Push(data['type'] + '-id-' + data['id']);
if (data['type'])
classes.Push(data['type']);
if (data['is-front-page'] === true)
classes.Push('home')
else
classes.Push('internal');
return classes;
}
Si quelqu'un connaît un bon moyen d'obtenir des données de présentation à partir de l'API WP, je suis tout ouïe, mais après des jours de piratage informatique, je ne pouvais pas trouver un moyen fiable et cohérent de sortir les classes. de $wp_query
. (post_classes
, en revanche, fonctionne comme un charme.)