按元值数字对分类列进行排序

时间:2017-07-06 作者:Emil Østervig

试图让分类管理列按自定义字段编号进行排序,这让我慢慢发疯。我有一个名为“typer”的自定义分类法,这些分类法有一个名为“prioritet”的自定义字段。

我设法让代码显示该列,并使其可排序。唯一的问题是,尽管所有字段都是数字,但它们是按字母顺序排序的。这意味着由[1、3、14、22]组成的字段集将显示为:

1.

14

22

3.

到目前为止我的代码

function create_date_column_for_issues($issue_columns) {
  $issue_columns[\'prioritet\'] = \'Prioritet / sortering\';
  return $issue_columns;
}
add_filter(\'manage_edit-typer_columns\', \'create_date_column_for_issues\');

function populate_date_column_for_issues($value, $column_name, $term_id) {
  $issue = get_term($term_id, \'typer\');
  $date = get_field(\'prioritet\', $issue);
  switch($column_name) {
    case \'prioritet\': 
        $value = $date;  


    break;
    default:

    break;
  }
  return $value;    
}
add_filter(\'manage_typer_custom_column\', \'populate_date_column_for_issues\', 10, 3);

function register_date_column_for_issues_sortable($columns) {
  $columns[\'prioritet\'] = \'prioritet\';
  return $columns;
}
add_filter(\'manage_edit-typer_sortable_columns\', \'register_date_column_for_issues_sortable\');

add_filter( \'terms_clauses\', \'filter_terms_clauses\', 10, 3 );

/**
 * Filter WP_Term_Query meta query
 *
 * @param   object  $query  WP_Term_Query
 * @return  object
 */
function filter_terms_clauses( $pieces, $taxonomies, $args ) {

    global $pagenow, $wpdb; 

    // Require ordering
    $orderby = ( isset( $_GET[\'orderby\'] ) ) ? trim( sanitize_text_field( $_GET[\'orderby\'] ) ) : \'\'; 
    if ( empty( $orderby ) ) { return $pieces; }

    // set taxonomy
    $taxonomy = $taxonomies[0];

    // only if current taxonomy or edit page in admin           
    if ( !is_admin() || $pagenow !== \'edit-tags.php\' || !in_array( $taxonomy, [ \'typer\' ] ) ) { return $pieces; }

    // and ordering matches
    if ( $orderby === \'prioritet\' ) {
        $pieces[\'join\']  .= \' INNER JOIN \' . $wpdb->termmeta . \' AS tm ON t.term_id = tm.term_id \';
        $pieces[\'where\'] .= \' AND tm.meta_key = "prioritet"\'; 
        $pieces[\'orderby\']  = \' ORDER BY tm.meta_value \'; 
    }

    return $pieces;
}
我对MySQL的知识几乎一无所知,所以我不知道该怎么做。

作为额外费用:

现在,排序将排除所有具有空字段的分类法。将这些显示在底部会很好,但我确实意识到我需要一种更复杂的查询方式。所以,只有在你脑子里有解决方案的时候,才加入到这项工作中来。

2 个回复
SO网友:dipak_pusti

我发布的代码是您的修改和简化版本。我用你的代码得到了我的解决方案。

/**
 * Filter WP_Term_Query meta query
 *
 * @param   object  $query  WP_Term_Query
 * @return  object
 */
function filter_terms_clauses( $pieces, $taxonomies, $args ) {

    global $pagenow, $wpdb;

    if(!is_admin()) {
        return $pieces;
    }

    if(
        is_admin() 
        && $pagenow == \'edit-tags.php\' 
        && $taxonomies[0] == \'typer\' 
        && ( isset($_GET[\'orderby\']) && $_GET[\'orderby\'] == \'prioritet\' )
    ) {

        $pieces[\'join\']     .= \' INNER JOIN \' . $wpdb->termmeta . \' AS tm ON t.term_id = tm.term_id \';
        $pieces[\'where\']    .= \' AND tm.meta_key = "prioritet"\'; 
        $pieces[\'orderby\']   = \' ORDER BY tm.meta_value \';
        $pieces[\'order\']     = isset($_GET[\'order\']) ? $_GET[\'order\'] : "DESC";
    }

    return $pieces;
}

add_filter( \'terms_clauses\', \'filter_terms_clauses\', 10, 3 );
希望这个有帮助。

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在评论中提供的答案

结束

相关推荐

从wp_post检索类别的MySQL查询

使用此查询检索具有特定post_typeSELECT * FROM wp_posts WHERE post_type = \'product\'; 如上所述here 类别不在wp_posts 表但术语表wp_terms wp_term_relationships wp_term_taxonomy在所有表格中搜索我脑海中的一个类别,我能找到的唯一一个类别实例是wp_terms 包含以下列的表在其他表格中寻找与此相关的交叉引用,并以某种方式将其与wp\\U帖子联系起来,这带来了一些复

按元值数字对分类列进行排序 - 小码农CODE - 行之有效找到问题解决它

按元值数字对分类列进行排序

时间:2017-07-06 作者:Emil Østervig

试图让分类管理列按自定义字段编号进行排序,这让我慢慢发疯。我有一个名为“typer”的自定义分类法,这些分类法有一个名为“prioritet”的自定义字段。

我设法让代码显示该列,并使其可排序。唯一的问题是,尽管所有字段都是数字,但它们是按字母顺序排序的。这意味着由[1、3、14、22]组成的字段集将显示为:

1.

14

22

3.

到目前为止我的代码

function create_date_column_for_issues($issue_columns) {
  $issue_columns[\'prioritet\'] = \'Prioritet / sortering\';
  return $issue_columns;
}
add_filter(\'manage_edit-typer_columns\', \'create_date_column_for_issues\');

function populate_date_column_for_issues($value, $column_name, $term_id) {
  $issue = get_term($term_id, \'typer\');
  $date = get_field(\'prioritet\', $issue);
  switch($column_name) {
    case \'prioritet\': 
        $value = $date;  


    break;
    default:

    break;
  }
  return $value;    
}
add_filter(\'manage_typer_custom_column\', \'populate_date_column_for_issues\', 10, 3);

function register_date_column_for_issues_sortable($columns) {
  $columns[\'prioritet\'] = \'prioritet\';
  return $columns;
}
add_filter(\'manage_edit-typer_sortable_columns\', \'register_date_column_for_issues_sortable\');

add_filter( \'terms_clauses\', \'filter_terms_clauses\', 10, 3 );

/**
 * Filter WP_Term_Query meta query
 *
 * @param   object  $query  WP_Term_Query
 * @return  object
 */
function filter_terms_clauses( $pieces, $taxonomies, $args ) {

    global $pagenow, $wpdb; 

    // Require ordering
    $orderby = ( isset( $_GET[\'orderby\'] ) ) ? trim( sanitize_text_field( $_GET[\'orderby\'] ) ) : \'\'; 
    if ( empty( $orderby ) ) { return $pieces; }

    // set taxonomy
    $taxonomy = $taxonomies[0];

    // only if current taxonomy or edit page in admin           
    if ( !is_admin() || $pagenow !== \'edit-tags.php\' || !in_array( $taxonomy, [ \'typer\' ] ) ) { return $pieces; }

    // and ordering matches
    if ( $orderby === \'prioritet\' ) {
        $pieces[\'join\']  .= \' INNER JOIN \' . $wpdb->termmeta . \' AS tm ON t.term_id = tm.term_id \';
        $pieces[\'where\'] .= \' AND tm.meta_key = "prioritet"\'; 
        $pieces[\'orderby\']  = \' ORDER BY tm.meta_value \'; 
    }

    return $pieces;
}
我对MySQL的知识几乎一无所知,所以我不知道该怎么做。

作为额外费用:

现在,排序将排除所有具有空字段的分类法。将这些显示在底部会很好,但我确实意识到我需要一种更复杂的查询方式。所以,只有在你脑子里有解决方案的时候,才加入到这项工作中来。

2 个回复
SO网友:dipak_pusti

我发布的代码是您的修改和简化版本。我用你的代码得到了我的解决方案。

/**
 * Filter WP_Term_Query meta query
 *
 * @param   object  $query  WP_Term_Query
 * @return  object
 */
function filter_terms_clauses( $pieces, $taxonomies, $args ) {

    global $pagenow, $wpdb;

    if(!is_admin()) {
        return $pieces;
    }

    if(
        is_admin() 
        && $pagenow == \'edit-tags.php\' 
        && $taxonomies[0] == \'typer\' 
        && ( isset($_GET[\'orderby\']) && $_GET[\'orderby\'] == \'prioritet\' )
    ) {

        $pieces[\'join\']     .= \' INNER JOIN \' . $wpdb->termmeta . \' AS tm ON t.term_id = tm.term_id \';
        $pieces[\'where\']    .= \' AND tm.meta_key = "prioritet"\'; 
        $pieces[\'orderby\']   = \' ORDER BY tm.meta_value \';
        $pieces[\'order\']     = isset($_GET[\'order\']) ? $_GET[\'order\'] : "DESC";
    }

    return $pieces;
}

add_filter( \'terms_clauses\', \'filter_terms_clauses\', 10, 3 );
希望这个有帮助。

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在评论中提供的答案

相关推荐

如何像使用wpdb一样使用MySQL?

根据标题,我需要使用LIKE操作符以编程方式使用$wpdb删除db上的一行。我想使用$wpdb->delete 消除发生的情况,但我不知道如何设置LIKE 操作员,因为在WHERE 它需要一个指定单个值或另一个数组的数组。我问你这个语法是否正确。$wpdb->delete(\'wp_posts\', array(\'post_type\' => \'flamingo_inbound\', \'post_content\' => \'%\'.$mail.\'%\'));提前感谢