自定义分类-自定义可排序列

时间:2014-08-27 作者:mihajlo

我已经创建了名为“城市”的自定义分类法,您可以在其中添加城市,并添加了自定义字段(单选按钮),其中有两个选项:“是”和“否”(不管是什么)。一切都很好,我可以得到那个值和其他东西。

后来,我想到了添加一个可排序的列(如“Name”、“Slug”、“Posts”等)。我已经创建了该列,使其可排序,但不知道如何按自定义字段对这些城市进行排序?现在它是按名称排序的,因为我无法让它与自定义字段一起工作。

可能有什么线索/暗示吗?

5 个回复
SO网友:cfx

我有一个类似的问题,并设法解决了它。在我的例子中,我有一个自定义的分类法,issue, 其中包含使用ACF PRO 插件字段名称为issue_date. 我想将日期列添加到issue 编辑屏幕位于wp-admin/edit-tags.php?taxonomy=issue 我想让管理员按日期对问题进行排序。

我试着pre_get_posts 正如上面@aifrim所回答的,但当WordPress将分类术语加载到编辑屏幕时,该操作不是查询的一部分。此外,分类术语在WordPress数据库中没有任何本机元数据,因此meta_query 不会工作,因为我的元数据存储在另一个表中。一个有趣的曲球。

Step 1: 创建新列本身,最初将为空

function create_date_column_for_issues($issue_columns) {
  $issue_columns[\'date\'] = \'Date\';
  return $issue_columns;
}
add_filter(\'manage_edit-issue_columns\', \'create_date_column_for_issues\');
Step 2: 填充新列

function populate_date_column_for_issues($value, $column_name, $term_id) {
  $issue = get_term($term_id, \'issue\');
  $date = DateTime::createFromFormat(\'Ymd\', get_field(\'issue_date\', $issue));
  switch($column_name) {
    case \'date\': 
      $value = $date->format(\'Y/m/d\');
    break;
    default:
    break;
  }
  return $value;    
}
add_filter(\'manage_issue_custom_column\', \'populate_date_column_for_issues\', 10, 3);
Step 3: 使新列可排序

function register_date_column_for_issues_sortable($columns) {
  $columns[\'date\'] = \'issue_date\';
  return $columns;
}
add_filter(\'manage_edit-issue_sortable_columns\', \'register_date_column_for_issues_sortable\');
Step 4: 定义自定义排序(神奇之处)

function sort_issues_by_date($pieces, $taxonomies, $args) {
  global $pagenow;
  if(!is_admin()) {
    return $pieces;
  }

  if(is_admin() && $pagenow == \'edit-tags.php\' && $taxonomies[0] == \'issue\' && (!isset($_GET[\'orderby\']) || $_GET[\'orderby\'] == \'issue_date\')) {
    $pieces[\'join\']   .= " INNER JOIN wp_options AS opt ON opt.option_name = concat(\'issue_\',t.term_id,\'_issue_date\')";
    $pieces[\'orderby\'] = "ORDER BY opt.option_value";
    $pieces[\'order\']   = isset($_GET[\'order\']) ? $_GET[\'order\'] : "DESC";
  }

  return $pieces;
}
add_filter(\'terms_clauses\', \'sort_issues_by_date\', 10, 3);
步骤4中的条件语句也将按降序排序issue_date 当没有设置其他排序条件时,作为默认排序。

我希望这能帮助其他人获得更好的管理体验!

SO网友:Joel Stransky

非常感谢@cfx的回答。既然WP有了术语元支持,我更新了步骤4以利用它。这个解决方案借鉴了这个答案https://wordpress.stackexchange.com/a/246206/85388 它显示了如何将meta\\u查询连接到orderby。

add_filter(\'pre_get_terms\', \'uh_service_type_taxonomy__orderby\');
function uh_service_type_taxonomy__orderby( $term_query ) {
  global $pagenow;
  if(!is_admin()) {
    return $term_query;
  }
  // WP_Term_Query does not define a get() or a set() method so the query_vars member must
  // be manipulated directly
  if(is_admin() && $pagenow == \'edit-tags.php\' && $term_query->query_vars[\'taxonomy\'][0] == \'uh_service_type_taxonomy\' && (!isset($_GET[\'orderby\']) || $_GET[\'orderby\'] == \'term_order\')) {
    // set orderby to the named clause in the meta_query
    $term_query->query_vars[\'orderby\'] = \'order_clause\';
    $term_query->query_vars[\'order\'] = isset($_GET[\'order\']) ? $_GET[\'order\'] : "DESC";
    // the OR relation and the NOT EXISTS clause allow for terms without a meta_value at all
    $args = array(\'relation\' => \'OR\',
      \'order_clause\' => array(
        \'key\' => \'taxonomy_term_order\',
        \'type\' => \'NUMERIC\'
      ),
      array(
        \'key\' => \'taxonomy_term_order\',
        \'compare\' => \'NOT EXISTS\'
      )
    );
    $term_query->meta_query = new WP_Meta_Query( $args );
  }
  return $term_query;
}

SO网友:aifrim

自定义字段是由用户或主题/插件创建的自定义post元数据,在这种情况下,自定义字段名为yesno。

要将其列添加到帖子或自定义帖子类型(myposttype),请执行以下操作:

add_filter(\'manage_edit-myposttype_columns\', \'my_custom_columns\');
function my_custom_columns($columns) {
    $columns[\'yesno\'] = \'Yes/No\';
    return $columns;
}
这是如何使新添加的列可排序的:

add_filter(\'manage_edit-myposttype_sortable_columns\', \'my_sortable_columns\');
function my_sortable_columns($columns)
{
    $columns[\'yesno\'] = \'yesno\';
    return $columns;
}
你就是这样分类的

add_action(\'pre_get_posts\', \'sort_my_posts\');
function sort_my_posts($query)
{
    if (!is_admin())
        return;
    $orderby = $query->get(\'orderby\');
    if ($orderby == \'yesno\') {
        $query->set(\'meta_key\', \'yesno\');
        $query->set(\'orderby\', \'yesno\');
    }
}
它将根据保存在元数据中的是或否值对它们进行asc或desc排序。

这就是你一直在寻找的吗?

SO网友:Lucas Gabriel

对我来说,我制定了一个自定义分类法,在该自定义分类法中,我有一个自定义元。我想在管理后端有一列,并使其可排序。为了使自定义meta中的自定义分类法具有可排序性,我这样做了。

https://pastebin.com/vr2sCKzX

public function pre_get_terms( $query ) {
    $meta_query_args = array(
        \'relation\' => \'AND\', // Optional, defaults to "AND"
        array(
            \'key\'     => \'order_index\',
            \'value\'   => 0,
            \'compare\' => \'>=\'
        )
    );
    $meta_query = new WP_Meta_Query( $meta_query_args );
    $query->meta_query = $meta_query;
    $query->orderby = \'position_clause\';
}
我在这个链接中找到了答案https://core.trac.wordpress.org/ticket/34996

我只需要修改@eherman24在评论中提供的答案

SO网友:Amit Geek

对于管理分类表可排序列,这是一个完美的解决方案。在特定术语中添加任何自定义字段,以便此字段值按列排序。还可以在活动主题的函数中添加此代码。php文件。enter image description here

add_filter( \'manage_edit-{taxonomy-name}_sortable_columns\' ), \'callback_term_sortable_columns_func\'));
 function callback_term_sortable_columns_func( $columns ) 
    {
        $columns[\'column-name\'] = \'column-name\';
        return $columns;
    }
add_filter(\'pre_get_terms\', \'callback_filter_terms_clauses\');
function callback_filter_terms_clauses( $term_query ) 
    {
        global $pagenow;
        if(!is_admin()) { return $term_query; }
        if(is_admin() && $pagenow == \'edit-tags.php\' && (!isset($_GET[\'orderby\']) || $_GET[\'orderby\'] == \'column-name\')) 
        {
            $term_query->query_vars[\'orderby\'] = \'meta_value\';
            $term_query->query_vars[\'order\'] = isset($_GET[\'order\']) ? $_GET[\'order\'] : "DESC";
            $args = array(\'relation\' => \'OR\',
                            \'order_clause\' => array(
                                \'key\' => \'{term_meta_key}\',
                                \'type\' => \'STRING\'
                            ),
                            array(
                                \'key\' => \'taxonomy_term_order\',
                                \'compare\' => \'NOT EXISTS\'
                            ),
                            array(
                                \'key\' => \'taxonomy_term_order\',
                                \'compare\' => \'=\'
                            )
                        );
            $term_query->meta_query = new WP_Meta_Query( $args );
        }
        return $term_query;
    }

结束

相关推荐

使用wp_Query_Columns进行WordPress分页

我使用的代码来自here 将循环拆分为列。这些列可以工作。我在数据库中有7篇帖子,showposts设置为6篇。我无法获取要显示的下一页链接?我在$args数组中有一个$paged变量,我在admin/reading中将每页的帖子数设置为5。下面是完整的循环。非常感谢。<?php $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; $args = array( \'showposts\' =