Ordene a ordem de controle em uma base per-post

4

Eu tenho uma taxonomia na qual a ordem de término é importante, mas varia de postagem para postagem. Por isso, quero poder definir a ordem em que os termos são exibidos por postagem:

  • Minha primeira postagem | Tagged: Maçãs, Laranjas, Bananas

  • Alguma outra postagem | Tagged: Laranjas, Bananas, Maçãs

Como isso varia de um post para outro, preciso de algo diferente do ordenamento abrangente de taxonomia suportado por plugins como Ordenação de Taxonomia Personalizada e Ordem de Termos de Taxonomia .

Estou procurando conselhos sobre como implementar isso. Aqui está um resumo do meu pensamento atual:

Ordenação por período final usando um campo personalizado

  1. Remova o metabox da taxonomia padrão usando remove_meta_box()

  2. Adicione uma interface de ordem de término contendo o metabox personalizado, por exemplo, arrastar e soltar (ou entrada de texto simples ao lado de cada termo para um inteiro que descreva a ordem do termo. Ou talvez seja possível adicionar arrastar e soltar a meta_box existente sem ter que remover e adicionar uma nova? **)

  3. Usando javascript, salve uma lista separada por vírgula de IDs de termo, em ordem, em um campo personalizado oculto, _mytermorder_taxonomyname. (Campo personalizado separado para cada taxonomia, por exemplo, _mytermorder_category, __mytermorder_tags, etc.)

  4. Crie uma função personalizada my_get_the_terms() que percorra os IDs no campo personalizado _taxonomyname_termorder. Se uma postagem tiver termos, mas nenhum campo _taxonomyname_termorder (como com postagens antigas), apenas retorne get_the_terms ().

  5. Em arquivos de temas relevantes, substitua as instâncias de get_the_terms() ou outras funções de termo nativas por my_get_the_terms() .

Você tem conselhos, alternativas, avisos ou snippets relacionados? Eu ficaria grato por qualquer pensamento. Obrigada!

Preocupações

  • E se a lista no campo personalizado ficar fora de sincronia com a lista de termos reais (como se os termos tivessem sido adicionados por meio de uma interface diferente da tela de edição de postagem, como o formulário de edição rápida / em massa ou -End Editor).

Solução: no início de my_get_the_terms() , podemos verificar se os IDs no campo personalizado correspondem aos termos retornados por get_the_terms. Se não, padrão para get_the_terms.

  • Novos termos não seriam capturados no primeiro uso, porque eles ainda não têm um ID. Você teria que salvar um novo termo antes que funcionasse. (Eu poderia viver com isso, mas é um problema.)

  • A meta box tem que listar os termos na ordem correta quando a página de pós-edição for carregada.

** Para a classificação arrastar e soltar no metabox padrão, descobri que posso usar o .sortable da jQuery UI, já disponível no admin; para uma taxonomia não hierárquica, é $('#taxonomyname .tagchecklist').sortable() .

    
por supertrue 15.01.2012 / 03:41

1 resposta

3

Não tenho certeza se entendi exatamente o que você está tentando realizar, mas descrevi uma maneira de classificar a ordem dos termos associados à postagem atual.

Html para o metabox do termo:

 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 classificar a lista acima e salvar o pedido usando ajax.

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

Função ajax do WordPress para salvar o pedido como um 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);
}

Isso salvará uma lista dos IDs do termo em ordem classificada como um array serializado:

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

Para mostrar a lista de termos ordenados no front end:

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