web-dev-qa-db-de.com

Taxonomiebedingungen speichern

Ich habe ein interessantes Problem, das hoffentlich jemand schnell beantworten kann.

Ich habe eine eigene Metabox erstellt, in der basierend auf "MEIN METABOX-CODE" (Liste unten) eine Dropdown-Liste aller meiner Begriffe in der von mir erstellten Taxonomie "event_types" korrekt angezeigt wird.

Wenn ich auf ein Problem stoße, kann ich den mit einem Beitrag verknüpften Begriff SPEICHERN/AKTUALISIEREN, wenn ein anderer Begriff aus der Dropdown-Liste ausgewählt und der Beitrag aktualisiert wird.

Nachdem ich an verschiedenen Code-Bits herumgebastelt hatte, konnte ich feststellen, dass ich durch MANUELLE Eingabe der term_ID-Nummern (durch Kommas getrennt) in den Array-Bereich die gewünschten Ergebnisse erhalte.

Wenn zum Beispiel beim Speichern des Beitrags eine Funktion diesen Code aufrufen soll

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

dann wird mein Beitrag aktualisiert und die term_ID 5 & 7 zugeordnet, was, wie Sie sehen können, ich im Array übergebe. Das Problem ist, dass dies in meiner functions.php-Datei fest codiert ist und nicht auf einem vom Benutzer ausgewählten Dropdown-Wert basiert (Hinweis: Ich versuche tatsächlich nur eine ID zu übergeben, aber ich habe zwei zum Testen durchgeführt, wie unten erläutert).

Ich konnte auch feststellen, dass ich, wenn ich der Metabox-Datei den folgenden Code hinzufüge, eine Liste der zugewiesenen Term-IDs wiedergeben kann, das letzte Element jedoch ein Komma enthält.

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

Also ... ich habe anscheinend 85% meines Problems gelöst. Die restlichen 15% meines Problems bleiben wie folgt:

  1. Was muss ich zu meinem functions.php-Dateicode (unten aufgeführt) hinzufügen, damit beim Erstellen/Aktualisieren eines Posts der aus meiner Taxonomie-Dropdown-Liste ausgewählte NEUE WERT in das Array übertragen wird?

  2. Obwohl ich in diesem Beispiel sicherstellen möchte, dass einem Post nur eine einzige Taxonomie zugeordnet werden kann, gibt es andere Situationen, in denen ich eine Checkbox-Liste erstellen möchte, in der ich mehr als einen Wert in das Array übergeben muss. Was muss ich als solches ändern, damit eine durch Kommas getrennte Liste von Term-IDs in das Array übergeben wird? Wenn Ihre Antwort die Verwendung eines Teils des oben aufgeführten Beispielcodes beinhaltet, in dem ich die IDs wiedergebe, wie kann ich dann sicherstellen, dass die letzte gedruckte ID am Ende kein Komma enthält? (Gibt es eine andere/bessere Möglichkeit? Ich habe Hinweise zum Hinzufügen eines Filters gesehen, bin mir aber nicht sicher, wie das gemacht wird ...)

Vielen Dank im Voraus - unten ist der Code, den ich derzeit in jeder Datei verwende.

CODE IN MEINER FUNCTIONS.PHP-DATEI

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

MEIN METABOX CODE

<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

Ich dachte, ich würde die Antwort auf diese Frage posten, nachdem Dimas mir helfen konnte.

Unter Verwendung seiner WPAlchemey-Klasse habe ich eine save_action-Variable hinzugefügt, die so aussieht (beachte, dass ich die Taxonomie für "category" verwende, die du natürlich in eine beliebige benutzerdefinierte Taxonomie ändern kannst):

'save_action'   => 'save_taxonomy_terms',

Ich füge dann die folgende Funktion dazu wie folgt hinzu:

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

Ein My Metabox-Code, der die Dropdown-Liste der Taxonomien anzeigt, sieht folgendermaßen aus:

<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