Orden de términos de control por publicación

4

Tengo una taxonomía en la cual el orden de los plazos es importante, pero varía de una publicación a otra. Así que quiero poder establecer el orden en que se muestran los términos por publicación:

  • Mi primera publicación | Etiquetado: manzanas, naranjas, plátanos

  • Alguna otra publicación | Etiquetado: naranjas, plátanos, manzanas

Dado que esto variaría de una publicación a otra, necesito algo más que el orden de los términos de toda la taxonomía compatible con complementos como Custom Taxonomy Sort y Orden de términos de taxonomía .

Estoy buscando consejos sobre cómo implementar esto. Aquí hay un resumen de mi pensamiento actual:

Orden de plazo por publicación utilizando un campo personalizado

  1. Elimine el metabox de taxonomía estándar usando remove_meta_box()

  2. Agregue metabox personalizado que contenga la interfaz de ordenamiento de términos, por ejemplo, arrastre y suelte (o ingrese el texto junto a cada término para un entero que describa el orden del término.) O tal vez sea posible agregar arrastrar y soltar a ¿El meta_box existente sin tener que eliminar y agregar uno nuevo? **)

  3. Usando javascript, guarde una lista de identificadores de términos separados por comas, en orden, en un campo personalizado oculto, _mytermorder_taxonomyname. (Campo personalizado separado para cada taxonomía, por ejemplo, _mytermorder_category, __mytermorder_tags, etc.)

  4. Cree una función personalizada my_get_the_terms() que recorra los ID en el campo personalizado _taxonomyname_termorder. Si una publicación tiene términos pero no un campo _taxonomyname_termorder (como en las publicaciones anteriores), simplemente devuelva get_the_terms ().

  5. En los archivos de temas relevantes, reemplace las instancias de get_the_terms() u otras funciones de términos nativos con my_get_the_terms() .

¿Tiene consejos, alternativas, advertencias o fragmentos relacionados? Estaría agradecido por cualquier pensamiento. ¡Gracias!

Preocupaciones

  • ¿Qué sucede si la lista en el campo personalizado no está sincronizada con la lista de términos real (como lo haría si los términos se agregaran a través de una interfaz que no sea la pantalla de edición posterior, como la forma de edición rápida / edición masiva o la parte frontal)? -End Editor).

Solución: al comienzo de my_get_the_terms() , podemos verificar si los ID en el campo personalizado coinciden con los términos devueltos por get_the_terms. Si no es así, el valor predeterminado es get_the_terms.

  • Los nuevos términos no se capturarían en el primer uso, porque todavía no tienen una identificación. Tendrías que guardar un nuevo término antes de que funcione. (Podría vivir con esto, pero es un problema).

  • El cuadro de meta tiene que enumerar los términos en el orden correcto cuando se carga la página de edición posterior.

** Para la clasificación de arrastrar y soltar en el metabox predeterminado, descubrí que puedo usar .sortable de jQuery UI, ya disponible en el administrador; para una taxonomía no jerárquica, es $('#taxonomyname .tagchecklist').sortable() .

    
pregunta supertrue 15.01.2012 - 03:41

1 respuesta

3

No estoy seguro de si entiendo exactamente lo que intentas lograr, pero he descrito una forma para que clasifiques el orden de los términos asociados con la publicación actual.

Html para el término metabox de orden:

 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 para que la lista anterior se pueda clasificar y guardar el pedido con ajax.

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

Función ajax de WordPress para guardar el pedido como un campo personalizado:

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

Esto guardará una lista de los identificadores de términos en orden ordenado como una matriz serializada:

_term_order = > formación(     term_order = > '123,312,110,34,44,27'  )

Para mostrar la lista de términos ordenados en el extremo delantero:

$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;
  }
    
respondido por el Chris_O 15.01.2012 - 05:31

Lea otras preguntas en las etiquetas