WP查询按元键排序自然排序?

时间:2014-09-08 作者:bestprogrammerintheworld

我有以下代码:

$args = array(
    \'posts_per_page\' => -1,
    \'post_type\' => \'product\',
    \'meta_key\'   => \'custom key\',
    \'orderby\'    => \'meta_value\',
    \'order\'      => \'ASC\',        
    \'no_found_rows\' => true,
    \'cache_results\' => false,
    \'include_children\' => false,
    \'tax_query\' => array(
        array(
            \'taxonomy\' => $taxonomy,
            \'field\' => \'id\',
            \'terms\' => array($cat_id)
        )
    )
 );  

$loop = new WP_Query($args);    
当自定义密钥为

FA3
FA1
FA10
wp query orderby参数将其排序为

FA1
FA10
FA3

when I want a nsort-algoritm:

FA1
FA3
FA10
有没有办法做到这一点WP_Query? (或是创建数组并对该数组进行排序的唯一选项nsort())

3 个回复
最合适的回答,由SO网友:Otto 整理而成

不,不是直接的WP\\U查询。这是由于几个因素造成的,其中最主要的一个因素是mySQL本身并没有对字母数字列进行自然排序。

WordPress确实支持orderby参数的“meta\\u value\\u num”,这会导致它将值转换为数字来执行排序,当您将全数字数据放入meta\\u值中时,这会起作用,但由于您有一组混合的文本和数字,因此无法使用它。

您可以将筛选器添加到posts_orderby 然后直接重写orderby子句,使其成为您喜欢的内容。如果您的数据总是以“FA”开头,那么您可以使过滤器返回如下内容:

LENGTH(meta_value) ASC, meta_value ASC

首先按长度排序,然后按值排序。因此,短款优先,给你一种半自然的排序。

SO网友:bestprogrammerintheworld

如果有人碰巧发现了这一点,我会给你一个解决方案,它使用“伪造的自然排序”(感谢Otto),但它也有多个自定义字段的排序。

function orderbyreplace($orderby ) {
    global $wpdb;
    $new = str_replace($wpdb->prefix.\'postmeta.meta_value ASC\', \'LENGTH(mt1.meta_value) ASC, mt1.meta_value ASC, mt2.meta_value ASC\', $orderby); 
    return $new;
}

function get_posts_by_tax_cat($taxonomy, $parent_cat_id) {
    $args = array(
        \'posts_per_page\' => -1, 
        \'post_type\' => \'product\',
        \'orderby\' => \'meta_value\',
        \'order\' => \'ASC\',
        \'meta_key\' => \'flansoppning\',     
        \'meta_query\' => array(
            array(
                \'key\' => \'flansoppning\',
                \'value\' => \'\',
                \'compare\' => \'LIKE\'
        ),
        array(
                \'key\' => \'gangstorlek_mm\',
                \'value\' => \'\',
                \'compare\' => \'LIKE\'
        )
    ),
    \'no_found_rows\' => true,
    \'cache_results\' => false,
    \'include_children\' => false,
    \'tax_query\' => array(
        array(
            \'taxonomy\' => $taxonomy,
            \'field\' => \'id\',
            \'terms\' => array($parent_cat_id)
        )
    )
  );

//Filter makes it possible to sort on flansoppning (length() gives natural sort) first and then gangstorlek_mm
add_filter(\'posts_orderby\',\'orderbyreplace\');
$loop = new WP_Query( $args );
remove_filter(\'posts_orderby\',\'orderbyreplace\');

$posts = $loop->posts;

if(!empty($posts)) {
        return $posts;
}
return array();
}

SO网友:Marcos Nakamine

作为对Otto答案的补充,如果您只需要修改product post\\u类型的查询,请尝试以下操作:

add_filter( \'posts_orderby\', \'modify_posts_orderby\', 10, 2 );
function modify_posts_orderby( $orderby_statement, $wp_query ) {
    // do not modify queries in the admin
    if( is_admin() ) { 
        return $orderby_statement;
    }

    // only modify queries for \'product\' post type
    if( $wp_query->get( \'post_type\' ) === \'product\' ) {
        $orderby_statement = "LENGTH(meta_value) DESC, meta_value DESC";
    }
    return $orderby_statement;
}

结束

相关推荐

custom sortable column

我正在尝试在我的时间线自定义帖子中为年份创建一个额外的列。我可以创建额外的列,实际上我可以对它进行排序,它工作正常,但我的所有页面似乎都不工作。这是我用来创建列并使其可排序的所有代码:// Register the column add_filter( \'manage_edit-maryg_timeline_columns\', \'set_custom_edit_date_columns\' ); add_action( \'manage_maryg_timeline_posts_cu