it-swarm.com.de

Kontrollieren Sie die Laufzeitreihenfolge auf Post-Basis

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:

Bestellung per Post-Term unter Verwendung eines benutzerdefinierten Feldes

  1. Entfernen Sie die Standard-Taxonomie-Metabox mit remove_meta_box()

  2. 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? **)

  3. 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.)

  4. 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.

  5. 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!

Sorgen

  • Was passiert, wenn die Liste im benutzerdefinierten Feld nicht mehr mit der tatsächlichen Begriffsliste synchronisiert ist (wie es der Fall wäre, wenn Begriffe über eine andere Oberfläche als den Bildschirm für die Nachbearbeitung hinzugefügt würden, z. B. über das Schnellbearbeitungs-/Sammelbearbeitungsformular oder den Front-End-Editor)? ).

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().

4
supertrue

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.

Html für die term order metabox:

 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>';

Javascript, um die obige Liste sortierbar zu machen und die Bestellung mit Ajax zu speichern.

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

WordPress Ajax-Funktion zum Speichern der Bestellung als benutzerdefiniertes Feld:

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')

So zeigen Sie die Liste der bestellten Begriffe im Frontend an:

$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;
  }
3
Chris_O