WordPress : Obtenir la valeur du champ méta de toutes les catégories

Publié par Jean-Michel le

Je définis un champ méta pour la catégorie et j’obtiens la valeur méta de chaque champ comme ceci :

$cat_meta = get_option( "meta_field_$cat1" );
if (isset($cat_meta['color'])){
    $cat1_color = $cat_meta['color'];
}

Puis-je obtenir la valeur du champ méta non vide de toutes les catégories à l’aide d’une boucle ?

Solution n°1 trouvée

Si vous utilisez la fonction get_categories() pour obtenir toutes les catégories, vous pouvez ensuite les parcourir en boucle. Pseudo-code partiel, mais cela fera l’affaire :

$categories = get_categories( array() );
$colors = array();

foreach ( $categories as $category ) {
$cat_meta = get_option( 'meta_field_' . $category->slug );
if (isset($cat_meta['color'])){
    $colors[ $category->term_id ] = $cat_meta['color'];
}
}

PS. Je ne sais pas si le champ de la table des options utilise le slug ou l’identifiant de catégorie. Le tableau de couleurs sera rempli avec les identifiants de la catégorie comme clé et la valeur du champ méta comme valeur.

SPP. get_categories()L’appel de fonction peut nécessiter des paramètres supplémentaires dans le tableau, ajustez-le à votre guise en utilisant les paramètres disponibles.

PPPS. Bien que ma réponse réponde techniquement à cette question, cette réponse de s_ha_dum est en fait une meilleure approche (peut nécessiter un peu plus de refactorisation cependant).

Solution n°2 trouvée

Utiliser get_categoriescomme dans la réponse @CoenJacobs est une façon de procéder. Une boucle comme celle-ci peut cependant ne pas être très efficace.

get_optionne vous permet pas de rechercher par caractère générique, ce qui, en raison de la manière dont vous avez construit vos clés, est ce dont vous auriez besoin pour éviter la boucle, mais une simple requête comme celle-ci le ferait :

$cat_meta = $wpdb->get_results("SELECT option_name,option_value FROM {$wpdb->options} WHERE option_value != '' AND option_name LIKE 'meta_field_%'");

Votre boucle ressemblerait alors à (si je ne lis pas mal):

foreach ( $cat_meta as $meta ) {
  if ('color' == $meta['option_value']){
    $colors[ $meta['option_name'] ] = $meta['option_value'];
  }
}

Quand je vois le besoin de quelque chose comme ça, je me demande toujours si le vrai problème n’est pas la façon dont les données sont stockées. Vous voudrez peut-être envisager de stocker votre méta de catégorie sous la forme d’un tableau sérialisé sous une seule clé. Que ce soit une bonne idée ou non dépend de plusieurs choses :

  1. Combien de données devez-vous stocker dans la clé ?
  2. Avez-vous besoin d’interroger par valeurs individuelles stockées dans la clé ?

Bien que vous puissiez stocker beaucoup de données dans une seule clé lorsque vous la récupérez, vous devez toujours toutes les récupérer et les traiter toutes. Cela peut ne pas être plus efficace que la requête ci-dessus.

Essayer de rechercher, par exemple, un nom de couleur particulier dans un tableau/objet sérialisé SQLest extrêmement inefficace et sujet aux erreurs.

Les mécanismes réels de stockage et de récupération du tableau/objet sont simples. WordPress fait à peu près le travail pour vous.

add_option('test_option_name',array('a','b','c'));

var_dump(get_option('test_option_name'));
Catégories : Wordpress

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *