Zapisywanie warunków taksonomii

16

Mam ciekawy problem, który mam nadzieję, że ktoś może szybko odpowiedzieć.

Stworzyłem własny metaboks, który w oparciu o „MY CAB METABOX” (lista poniżej) poprawnie wyświetla listę rozwijaną wszystkich moich terminów w ramach stworzonej przeze mnie taksonomii „event_types”.

Gdy napotykam problem, mogę ZAPISZ / AKTUALIZOWAĆ termin związany z postem, gdy z rozwijanego menu zostanie wybrany inny termin i post zostanie zaktualizowany.

Po majstrowaniu przy różnych bitach kodu byłem w stanie dowiedzieć się, że RĘCZNIE wprowadzając numer (-y) term_ID [oddzielone przecinkami] w obszarze tablicy otrzymuję wyniki, których szukam.

Na przykład, jeśli podczas zapisywania postu funkcja miałaby wywołać ten kod

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

wtedy mój post BĘDZIE AKTUALIZOWAĆ i powiąż z nim term_ID 5 i 7, które, jak widać, przekazuję w tablicy. Problem polega na tym, że jest on zakodowany na stałe w moim pliku functions.php i nie jest oparty na wartości rozwijanej wybranej przez użytkownika (uwaga: w rzeczywistości próbuję przekazać tylko jeden identyfikator, ale zrobiłem dwa dla testowania, jak wyjaśniono poniżej).

Byłem także w stanie dowiedzieć się, że jeśli dodam następujący kod do mojego pliku metabox, to mogę wyświetlić listę identyfikatorów przypisanych terminów, ale ostatni element ma przecinek.

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

Więc ... wygląda na to, że rozwiązałem 85% mojego problemu. Pozostałe 15% mojego problemu pozostaje następujące:

  1. Co muszę dodać do kodu pliku functions.php (wymienionego poniżej), aby podczas tworzenia / aktualizacji postu NOWA WARTOŚĆ wybrana z mojej listy rozwijanej systematyki była przekazywana do tablicy?

  2. Chociaż w tym przykładzie staram się upewnić, że ze postem można powiązać tylko POJEDYNCZĄ taksonomię, istnieją inne sytuacje, w których chciałbym utworzyć listę pól wyboru, która wymagałaby przekazania więcej niż jednej wartości do tablicy. W związku z tym, co powinienem zmienić, aby lista identyfikatorów terminów była rozdzielana przecinkami? Jeśli twoja odpowiedź wymaga użycia części lub części przykładowego kodu wymienionego powyżej, w którym echo identyfikatorów, to w jaki sposób mogę upewnić się, że ostatni wydrukowany identyfikator nie ma przecinka na końcu? (Czy istnieje inny / lepszy sposób na zrobienie tego? Widziałem wskazówki, które mogą odnosić się do dodawania filtra, ale nie jestem pewien, jak to się robi ...)

Z góry dziękuję - poniżej znajduje się kod, którego obecnie używam w każdym pliku.

KOD W MOIM PLIKU 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);
    }

MÓJ KOD 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
źródło

Odpowiedzi:

6

Uznałem, że opublikuję odpowiedź na to pytanie, gdy Dimas będzie mógł mi pomóc.

Wykorzystując swoją klasę WPAlchemey dodałem zmienną save działanie, która wyglądała tak (zwróć uwagę, że używam taksonomii dla „kategorii”, którą oczywiście możesz zmienić na dowolną niestandardową taksonomię):

'save_action'   => 'save_taxonomy_terms',

Następnie dodaję do tego następującą funkcję:

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

Mój kod metabox, który wyświetla listę rozwijaną taksonomii, wygląda następująco:

<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
źródło