Termini di tassonomia di risparmio


16

Ho un problema interessante al quale spero che qualcuno possa rispondere rapidamente.

Ho creato il mio metabox che, in base al "MIO CODICE METABOX" (elenco di seguito) visualizza correttamente un elenco a discesa di tutti i miei termini all'interno della tassonomia "event_types" che ho creato.

Dove sto incontrando un problema è riuscire a SALVARE / AGGIORNARE il termine associato a un post quando viene selezionato un termine diverso dal menu a discesa e il post viene aggiornato.

Dopo aver armeggiato con vari bit di codice sono stato in grado di capire che inserendo MANUALMENTE i numeri term_ID (separati da virgole) nell'area dell'array ottengo i risultati che sto cercando.

Ad esempio se salvando il post una funzione dovesse chiamare questo codice

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

quindi il mio post si aggiorna e associa ad esso il term_ID 5 e 7 che, come puoi vedere, sto passando nell'array. Il problema è che questo è codificato nel mio file Functions.php e non si basa su un valore a discesa selezionato dall'utente (nota: in realtà sto solo provando a passare un ID ma ne ho fatti due per i test, come spiegato di seguito).

Sono stato anche in grado di capire che se aggiungo il seguente codice al mio file metabox, posso echo un elenco di ID termine assegnato ma l'ultimo elemento ha una virgola.

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

Quindi ... sembra che ho risolto l'85% del mio problema. Il restante 15% del mio problema rimane il seguente:

  1. Cosa devo aggiungere al mio codice del file Functions.php (elencato di seguito) in modo che quando creo / aggiorno un post il NUOVO VALORE selezionato dal mio elenco a discesa della tassonomia venga passato nell'array?

  2. Anche se in questo esempio sto cercando di garantire che solo una SINGOLA tassonomia possa essere associata a un post, ci sono altre situazioni in cui vorrei creare un elenco di caselle di controllo che mi richiederebbe di passare più di un valore nell'array. Come tale, cosa dovrei cambiare in modo che un array separato da virgole di ID termini sia passato nell'array? Se la tua risposta implica l'uso di parte o parte del codice di esempio che ho elencato sopra, dove echo gli ID, come posso garantire che l'ultimo ID stampato non abbia una virgola alla fine? (Esiste un modo diverso / migliore per farlo? Ho visto dei suggerimenti che potrebbero riguardare l'aggiunta di un filtro ma non sono sicuro di come sia fatto ...)

Grazie mille in anticipo, di seguito è riportato il codice che sto attualmente utilizzando in ogni file.

CODICE IN MY FUNCTIONS.PHP FILE

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);
    }

IL MIO CODICE 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>

Risposte:


6

Ho pensato che avrei postato la risposta dopo che Dimas mi avrebbe aiutato.

Utilizzando la sua classe WPAlchemey ho aggiunto una variante save_action che assomigliava a questa (nota che sto usando la tassonomia per "categoria" che ovviamente puoi cambiare in qualunque sia la tua tassonomia personalizzata):

'save_action'   => 'save_taxonomy_terms',

Aggiungo quindi la seguente funzione per questo come segue:

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

Un mio codice metabox che mostra l'elenco a discesa delle tassonomie è simile al seguente:

<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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.