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:
Supprimer la métaboxe de taxonomie standard à l'aide de remove_meta_box()
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? **)
À 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.)
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 ().
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!
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()
.
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.
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>';
* 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;
});
});
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')
$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;
}