web-dev-qa-db-fra.com

body_class REST champ dans WP-API

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.

1
bigsweater

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.)

0
bigsweater