web-dev-qa-db-fra.com

Enregistrement des termes de taxonomie

J'ai un problème intéressant auquel j'espère que quelqu'un pourra répondre rapidement.

J'ai créé ma propre métabox qui, basée sur "MON CODE DE METABOX" (liste ci-dessous), affiche correctement une liste déroulante de tous mes termes dans la taxonomie "event_types" que j'ai créée.

Lorsque je rencontre un problème, je peux enregistrer/mettre à jour le terme associé à une publication lorsqu'un terme différent est sélectionné dans la liste déroulante et que la publication est mise à jour.

Après avoir bricolé avec divers bits de code, j'ai pu comprendre qu'en entrant manuellement le (s) numéro (s) term_ID (séparés par des virgules) dans la zone de tableau, j'obtenais les résultats que je cherchais.

Par exemple si lors de la sauvegarde du post une fonction appelait ce code

wp_set_post_terms( $post_id, array(5,7), 'event_types', FALSE);

alors mon post MISE À JOUR et associe le term_ID 5 & 7 auquel, comme vous pouvez le constater, je passe dans le tableau. Le problème est qu’il est codé en dur dans mon fichier functions.php et non basé sur une valeur de liste déroulante sélectionnée par l’utilisateur (note: j’essaie en fait de transmettre un seul ID mais j’en ai fait deux comme indiqué ci-dessous.

J'ai également pu comprendre que si j'ajoutais le code suivant à mon fichier metabox, je pouvais alors faire écho à une liste d'ID de termes attribués, mais le dernier élément avait une virgule.

<?php $event_types = wp_get_object_terms($post->ID, 'event_types'); 
foreach ($event_types as $event_type) { echo $event_type->term_id . ','; } ?>

Donc ... il semble que 85% de mes problèmes soient résolus. Les 15% restants de mon problème restent les suivants:

  1. Que dois-je ajouter à mon code de fichier functions.php (indiqué ci-dessous) pour que, lorsque je crée/mette à jour un message, la NOUVELLE VALEUR sélectionnée dans ma liste déroulante de taxonomie soit transmise au tableau?

  2. Bien que, dans cet exemple, je cherche à m'assurer que seule une taxonomie SINGLE puisse être associée à une publication, il existe d'autres situations dans lesquelles j'aimerais créer une liste de cases à cocher qui nécessiterait que je passe plus d'une valeur dans le tableau. En tant que tel, que devrais-je changer pour qu'une liste d'identifiants de termes séparés par des virgules soit passée dans le tableau? Si votre réponse implique l'utilisation d'une partie ou de partie de l'exemple de code que j'ai énuméré ci-dessus et où je répète les identifiants, comment puis-je m'assurer que le dernier identifiant imprimé ne comporte pas de virgule à la fin? (Y a-t-il un moyen différent/meilleur de le faire? J'ai vu des astuces qui pourraient concerner l'ajout d'un filtre mais je ne suis pas sûr de savoir comment cela est fait ...)

Merci beaucoup à l’avance. Vous trouverez ci-dessous le code que j’utilise actuellement dans chaque fichier.

CODE DANS MES FONCTIONS.FICHIER PHP

function save_event_taxonomy_terms($meta, $post_id) {
        $event_types = wp_get_object_terms($post->ID, 'event_types'); 
        wp_set_post_terms( $post_id, array($names), 'event_types', FALSE);
    }

MON CODE METABOX

<select name='post_event_types' id='post_event-types'>
// DISPLAY TERMS AS DROP DOWN OPTIONS
    <?php 
    $names = wp_get_object_terms($post->ID, 'event_types'); 
    $event_types = get_terms('event_types', 'hide_empty=0'); 
    ?>
    <option class='event_type-option' value='' <?php if (!count($names)) echo "selected";?>>Not Assigned</option>
    <?php foreach ($event_types as $event_type) {
        if (!is_wp_error($names) && !empty($names) && !strcmp($event_type->slug, $names[0]->slug)) 
        echo "<option class='event_type-option' value='" . $event_type->slug . "' selected>" . $event_type->name . "</option>\n"; 
        else
        echo "<option class='event_type-option' value='" . $event_type->slug . "'>" . $event_type->name . "</option>\n"; 
    }
    ?>
</select>
15
NetConstructor.com

J'ai pensé que je posterais la réponse à cette question après que Dimas ait pu m'aider.

En utilisant sa classe WPAlchemey, j’ai ajouté un save_action var qui ressemblait à ceci (notez que j’utilise la taxonomie pour "catégorie" que vous pouvez bien sûr changer en fonction de votre taxonomie personnalisée):

'save_action'   => 'save_taxonomy_terms',

J'ajoute ensuite la fonction suivante pour cela comme suit:

function save_taxonomy_terms($meta, $post_id) {
wp_set_post_terms($post_id, array($meta['my_terms']), 'category', FALSE);
}

Un code my metabox qui affiche la liste déroulante des taxonomies se présente comme suit:

<label>Event Category:</label>
    <?php $terms = get_terms('category', 'hide_empty=0'); ?>
    <?php $mb->the_field('my_terms'); ?>
    <select name="<?php $mb->the_name(); ?>">
    <option value='' <?php if (!count($terms)) echo "selected";?>>Not Assigned</option>
    <?php foreach ($terms as $term): ?>
    <option value="<?php echo $term->term_id; ?>"<?php $mb->the_select_state($term->term_id); ?><?php echo '>' . $term->name; ?></option>
    <?php endforeach; ?>
    </select>
6
NetConstructor.com