web-dev-qa-db-fra.com

Ordre des termes de contrôle poste par poste

J'ai une taxonomie dans laquelle l'ordre des termes est important, mais varie d'un article à l'autre. Je souhaite donc pouvoir définir l'ordre d'affichage des conditions pour chaque poste:

  • Mon premier message| Tagged: Pommes, Oranges, Bananes

  • Un autre article| Tagged: Oranges, Bananes, Pommes

Étant donné que cela varie d'une publication à l'autre, il me faut autre chose que la commande de termes de taxonomie étendue prise en charge par des plugins tels que Trier la taxonomie personnalisée et Termes de taxonomie Commande .

Je cherche des conseils sur la façon de mettre en œuvre cela. Voici un aperçu de ma pensée actuelle:

Commande par période sur la base d'un champ personnalisé

  1. Supprimer la métaboxe de taxonomie standard à l'aide de remove_meta_box()

  2. Ajoutez une interface de commande de termes contenant des métabox personnalisés, par exemple, un glisser-déposer (ou une simple saisie de texte à côté de chaque terme pour un entier décrivant l'ordre du terme.) enlever et en ajouter un nouveau? **)

  3. À l'aide de javascript, enregistrez une liste d'ID de termes séparés par des virgules, dans l'ordre, dans un champ personnalisé masqué, _mytermorder_taxonomyname. (Champ personnalisé séparé pour chaque taxonomie, par exemple, _mytermorder_category, __mytermorder_tags, etc.)

  4. Créez une fonction personnalisée my_get_the_terms() qui parcourt les ID du champ personnalisé _taxonomyname_termorder. Si une publication a des termes mais pas de champ _taxonomyname_termorder (comme avec les anciennes publications), il suffit de renvoyer get_the_terms ().

  5. Dans les fichiers de thème pertinents, remplacez les instances de get_the_terms() ou d'autres fonctions de terme natives par my_get_the_terms().

Avez-vous des conseils, des alternatives, des avertissements ou des extraits associés? Je serais reconnaissant pour toutes les pensées. Je vous remercie!

Préoccupations

  • Que se passe-t-il si la liste du champ personnalisé n'est plus synchronisée avec la liste de termes réelle (comme si les termes étaient ajoutés via une interface autre que l'écran de modification ultérieure, tel que le formulaire d'édition rapide/en bloc ou l'éditeur Front-End Editor? ).

Solution:Au début de my_get_the_terms(), nous pouvons vérifier si les identifiants du champ personnalisé correspondent aux termes renvoyés par get_the_terms. Sinon, get_the_terms par défaut.

  • Les nouveaux termes ne seraient pas capturés lors de la première utilisation, car ils ne possèdent pas encore d'identifiant. Vous devez enregistrer un nouveau terme avant que cela ne fonctionne. (Je pourrais vivre avec ça, mais c'est un problème.)

  • La méta-boîte doit lister les termes dans le bon ordre lors du chargement de la page d'édition.


** Pour le tri par glisser-déposer dans la metabox par défaut, j'ai découvert que je pouvais utiliser le fichier .sortable de jQuery UI, déjà disponible dans l'administrateur; pour une taxonomie non hiérarchique, il s'agit de $('#taxonomyname .tagchecklist').sortable().

4
supertrue

Je ne suis pas sûr de comprendre exactement ce que vous essayez d'accomplir, mais je vous ai présenté un moyen de trier l'ordre des termes associés à la publication actuelle.

Html pour le terme commande 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 pour rendre la liste ci-dessus triable et sauvegarder la commande en utilisant ajax.

* Remarque: nécessite 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 fonction pour enregistrer la commande en tant que champ personnalisé:

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

Ceci sauvegardera une liste des identifiants de termes dans l’ordre trié comme un tableau sérialisé:

_term_order => array (term_order => '123,312,110,34,44,27')

Pour afficher la liste des termes commandés au début du processus:

$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