Ich habe eine Taxonomie, bei der es auf die Reihenfolge ankommt, die sich jedoch von Post zu Post unterscheidet. Ich möchte also die Reihenfolge festlegen können, in der die Begriffe pro Post angezeigt werden:
Mein erster Beitrag| Etikettiert: Äpfel, Orangen, Bananen
Ein anderer Beitrag| Tagged: Orangen, Bananen, Äpfel
Da dies von Post zu Post variieren würde, benötige ich etwas anderes als die taxonomieweite Sortierung von Begriffen, die von Plugins wie Benutzerdefinierte Taxonomiesortierung und Taxonomiebegriffe unterstützt wird.
Ich suche Rat, wie ich das umsetzen kann. Hier ist ein Überblick über mein aktuelles Denken:
Entfernen Sie die Standard-Taxonomie-Metabox mit remove_meta_box()
Fügen Sie eine benutzerdefinierte Metabox hinzu, die eine Schnittstelle zur Sortierung von Begriffen enthält, z. B. Drag-and-Drop (oder einfache Texteingabe neben jedem Begriff für eine Ganzzahl, die die Sortierung eines Begriffs beschreibt). (Oder Sie können Drag-and-Drop zu der vorhandenen meta_box hinzufügen, ohne dies zu müssen Neues entfernen und hinzufügen? **)
Speichern Sie mit Javascript eine durch Kommas getrennte Liste von Term-IDs in der Reihenfolge _mytermorder_taxonomyname in einem ausgeblendeten benutzerdefinierten Feld. (Separates benutzerdefiniertes Feld für jede Taxonomie, z. B. _mytermorder_category, __mytermorder_tags usw.)
Erstellen Sie eine benutzerdefinierte Funktion my_get_the_terms()
, die die IDs im benutzerdefinierten Feld _taxonomyname_termorder durchläuft. Wenn ein Beitrag Begriffe enthält, aber kein Feld _taxonomyname_termorder (wie bei alten Beiträgen), geben Sie einfach get_the_terms () zurück.
Ersetzen Sie in relevanten Designdateien Instanzen von get_the_terms()
oder anderen nativen Termfunktionen durch my_get_the_terms()
.
Haben Sie Ratschläge, Alternativen, Warnungen oder verwandte Ausschnitte? Für Gedanken wäre ich dankbar. Vielen Dank!
Lösung:Zu Beginn von my_get_the_terms()
können wir überprüfen, ob die IDs im benutzerdefinierten Feld mit den von get_the_terms zurückgegebenen Begriffen übereinstimmen. Wenn nicht, standardmäßig get_the_terms.
Neue Begriffe würden bei der ersten Verwendung nicht erfasst, da sie noch keine ID haben. Sie müssen einen neuen Begriff speichern, bevor er funktioniert. (Ich könnte damit leben, aber es ist ein Problem.)
Das Meta-Feld muss die Begriffe in der richtigen Reihenfolge auflisten, wenn die Nachbearbeitungsseite geladen wird.
** Beim Sortieren per Drag & Drop in der Standard-Metabox habe ich festgestellt, dass ich die .sortable-Datei der jQuery-Benutzeroberfläche verwenden kann, die bereits im Administrator verfügbar ist. für eine nicht hierarchische Taxonomie ist es $('#taxonomyname .tagchecklist').sortable()
.
Ich bin nicht sicher, ob ich genau verstehe, was Sie erreichen wollen, aber ich habe Ihnen eine Möglichkeit aufgezeigt, die Reihenfolge der mit dem aktuellen Beitrag verknüpften Begriffe zu sortieren.
echo '<ul id="the-terms">'
$terms = get_the_terms( $post->ID, $taxonomy );
foreach ( $terms as $term ) {
echo '<li class="item" id="term-'.$term->term_id.'">'. $term->name .'</li>';
}
echo '</ul>';
echo '<a href="javascript: void(0); return false;" id="save_term_order" class="button-primary">Update Order</a>';
* Hinweis: Erfordert jQuery UI-Sortable.
jQuery(document).ready(function() {
// Make the term list sortable
jQuery("#the-terms").sortable({
items: '.item',
placeholder: 'sortable-placeholder',
tolerance: 'pointer',
distance: 1,
forcePlaceholderSize: true,
helper: 'clone',
cursor: 'move'
});
// Save the order using ajax
jQuery("#save_term_order").live("click", function() {
var postID = $("#post_ID").val();
jQuery.post(ajaxurl, {
action:'save_term_order',
cache: false,
post_id: postID,
order: jQuery("#the-terms").sortable('toArray').toString(),
success: ajax_response()
});
return false;
});
});
add_action ( 'wp_ajax_save_term_order', 'term_order_save' );
function term_order_save () {
global $wpdb;
$wpdb->flush ();
$item_id = $_POST['post_id'];
$meta_key = '_term_order';
$order = $_POST[ 'order' ];
$str = str_replace ( "term-", "", $order );
$int = str_replace ( "'", "", $str );
update_post_meta ( $item_id, $meta_key, array ( 'term_order' => $int ) );
$response = '<p>Term order updated</p>';
echo $response;
die(1);
}
Dadurch wird eine Liste der Term-IDs in der angegebenen Reihenfolge als serialisiertes Array gespeichert:
_term_order => array (term_order => '123,312,110,34,44,27')
$orderd_terms = get_post_meta ( $post->ID, '_term_order', true );
$terms = $ordered_terms[ 'term_order' ];
$term_ids = explode ( ",", $terms );
for ( $i = 0; $i < count ( $term_ids ); $i ++ ) {
$term = get_term( $term_ids[$i], $taxonomy, OBJECT)
echo $term->name;
}