基于每个职位的控制期限顺序

时间:2012-01-15 作者:supertrue

我有一个分类法,其中术语顺序很重要,但每篇文章都有所不同。因此,我希望能够设置条款在每篇文章中的显示顺序:

  • My first post | 标签:苹果、桔子、香蕉

  • Some other post | 标签:橙子、香蕉、苹果

由于这在不同的帖子中有所不同,我需要的不是像Custom Taxonomy SortTaxonomy Terms Order.

我正在寻求关于如何实施这一点的建议。以下是我当前想法的概要:

使用自定义字段按学期后排序使用remove_meta_box()

添加包含术语排序界面的自定义元框,例如拖放(或在每个术语旁边输入简单文本,以表示描述术语顺序的整数)。(或者可以将拖放添加到现有元框,而无需删除和添加新的元框?**)

使用javascript,在隐藏的自定义字段\\u mytermorder\\u taxonomyname中按顺序保存以逗号分隔的术语ID列表。(每个分类法都有单独的自定义字段,例如,\\u mytermorder\\u类别、\\u mytermorder\\u标记等)

创建自定义函数my_get_the_terms() 循环遍历\\u taxonomyname\\u termorder自定义字段中的ID。如果一篇文章有术语,但没有\\u taxonomyname\\u termorder字段(与旧文章一样),只需返回get\\u the\\u terms()。

在相关主题文件中,替换get_the_terms() 或其他本机术语函数my_get_the_terms().

您是否有建议、备选方案、警告或相关片段?如果有任何想法,我将不胜感激。非常感谢。

关注如果自定义字段中的列表与实际术语列表不同步(如果术语是通过编辑后屏幕以外的界面添加的,如快速编辑/批量编辑表单或前端编辑器),该怎么办Solution: 在开始my_get_the_terms(), 我们可以检查自定义字段中的ID是否与get\\u the\\u terms返回的术语匹配。如果不是,则默认为获取\\u术语。

新术语在首次使用时不会被捕获,因为它们还没有ID。您必须先保存一个新术语,然后才能使用。(我可以接受,但这是个问题。)

加载后期编辑页面时,元框必须按正确的顺序列出术语。

对于在默认元框中进行拖放排序,我发现我可以使用jQuery UI。可排序,已在admin中提供;对于非层次分类法,它是$(\'#taxonomyname .tagchecklist\').sortable().

3 个回复
SO网友:Chris_O

我不确定我是否完全理解你想要实现的目标,但我已经为你概述了一种方法,可以对与当前帖子相关的术语进行排序。

术语order metabox的Html:

 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使上述列表可排序并使用ajax保存顺序*注意:需要jQuery UI可排序。

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函数:
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);
}
这将以序列化数组的顺序保存术语id的列表:

_term\\u order=>数组(term\\u order=>“123312110,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;
  }

SO网友:Antti Koskinen

很抱歉,在这么长时间之后,我又把这个问题提了回来。这种需求是我最近遇到的,在寻找答案的过程中,我碰到了这个问题。

经过一番挖掘,我发现WordPress显然已经有一段时间了(ticket #5857) A.term_order 中的列wp_term_relationships 表来解决此特定问题。

要使用此列和术语排序,您需要添加

\'sort\'      => true,
\'args\' => array(
    \'orderby\' => \'term_order\',
),
register_taxonomy $args, 注册自定义分类时,或register_taxonomy_args, 如果修改现有分类法。

当然,这不会在编辑视图上提供良好的拖放术语排序,但只会按照术语附加到帖子的顺序保存这些术语。你需要注意你可能在你的网站上安装的任何贪婪的插件,这可能会把事情搞砸。

我想这是我第一次在register_taxonomy documentation page 因为他们在那里的知名度可能有点低。但在源文件中,它们的文档记录得更好,taxonomy.php, register_taxonomy()

@type bool $sort
Whether terms in this taxonomy should be sorted in the order 
they are provided to wp_set_object_terms(). 
Default null which equates to false.

@type array $args
Array of arguments to automatically use inside wp_get_object_terms() or this taxonomy.

SO网友:irfanahmad7272

下面是一个对我帮助很大的变通方法。我曾尝试在wp文档中探索register\\u分类法和args,最终成功了。

add_filter( \'register_taxonomy_args\', \'wpdocs_my_taxonomy_team_args\', 10, 2 );
function wpdocs_my_taxonomy_team_args( $args, $taxonomy ) {
     
    if ( $taxonomy === "team" || $taxonomy === "post_tag") {
        $args[\'sort\'] = true;
        $args[\'args\'] = array(\'orderby\' => \'term_order\');
    }
     
    return $args;
}

结束

相关推荐

Add Post Tags to Body Class

想要将post标记名称添加到body类-我成功地使用下面的代码将类别添加到body类- //adds new body class for post category add_filter(\'body_class\', \'add_category_class_single\'); function add_category_class_single($classes){ global $post; $category = get_the_ca