Enregistrement des termes de taxonomie

16

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, sur la base de "MON CODE 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, c'est la possibilité d'enregistrer / mettre à jour le terme associé à un message lorsqu'un autre terme est sélectionné dans la liste déroulante et que le message est mis à jour.

Après avoir bricolé divers bits de code, j'ai pu comprendre qu'en entrant MANUELLEMENT le (s) nombre (s) term_ID [séparés par des virgules] dans la zone du tableau, j'obtiens les résultats que je recherche.

Par exemple, si lors de l'enregistrement du message, une fonction appelait ce code

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

puis mon article MISE À JOUR et associera le term_ID 5 & 7 qui, comme vous pouvez le voir, je passe dans le tableau. Le problème est que cela 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 (remarque: j'essaie en fait de ne transmettre qu'un seul ID mais j'en ai fait deux pour les tests comme expliqué ci-dessous).

J'ai également pu comprendre que si j'ajoute le code suivant à mon fichier metabox, je suis en mesure de faire écho à une liste d'ID de termes attribués, mais le dernier élément a 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 mon problème soit résolu. Les 15% restants de mon problème restent les suivants:

  1. Que dois-je ajouter à mon code de fichier functions.php (répertorié ci-dessous) pour que lorsque je crée / mette à jour une publication, 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 taxinomie UNIQUE peut être associée à un message, il existe d'autres situations où je voudrais créer une liste de cases à cocher qui m'obligerait à passer plus d'une valeur dans le tableau. En tant que tel, que devrais-je changer pour qu'une liste d'ID de termes séparés par des virgules soit passée dans le tableau? Si votre réponse implique d'utiliser une partie ou une partie du code d'exemple que j'ai énuméré ci-dessus, où je fais écho aux ID, alors comment puis-je m'assurer que le dernier ID imprimé n'a pas de virgule à la fin? (Y a-t-il une façon différente / meilleure de le faire? J'ai vu des conseils qui pourraient se rapporter à l'ajout d'un filtre mais je ne sais pas comment cela se fait ...)

Merci beaucoup à l'avance - voici le code que j'utilise actuellement dans chaque fichier.

CODE DANS MON FICHIER FUNCTIONS.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>
NetConstructor.com
la source

Réponses:

6

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

En utilisant sa classe WPAlchemey, j'ai ajouté une var save_action qui ressemblait à ceci (notez que j'utilise la taxonomie pour "catégorie" que vous pouvez bien sûr changer en quelle que soit 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 de ma metabox qui affiche la liste déroulante des taxonomies ressemble à ceci:

<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>
NetConstructor.com
la source