wordpress $query->设置为按 *manipulated* ACF meta键值对归档产品页面进行排序

mwyxok5s  于 2023-05-28  发布在  WordPress
关注(0)|答案(2)|浏览(119)

我尝试使用pre_get_posts操作钩子按ACF字段对存档产品页面的产品进行排序。
ACF字段是一个字符串,包含字符和数值
我的解决方案:添加丢失的前导零,以便'040' < '180'将保持不变。
以下代码不起作用。我错过了什么?

function sort_batteries_by_amper( $query ) {
        if( isset($query->query_vars['post_type']) && $query->query_vars['post_type'] == 'product' ) {
            $query->set('orderby', 'meta_value');    
            $query->set('meta_key', 'MY_KEY');    
            $query->set('order', 'ASC'); 
            $value = get_ah_value($query, 'MY_KEY'); // add leading zero's to int values < 100
            $query->set( 'meta_value', $value );
        }
        return $query;
    }

    add_action('pre_get_posts', 'sort_batteries_by_amper');
9lowa7mx

9lowa7mx1#

试试看

$query->set('orderby', 'meta_value_num');

代替

$query->set('orderby', 'meta_value');
of1yzvn4

of1yzvn42#

下面是一个完整的解决方案,工程

add_action( 'woocommerce_product_query', 'ah_product_query' );
function ah_product_query( $q ) {
    if ( ! is_admin() ) { 
        $acffieldname = 'ACF_KEY_1';
        if ($q->queried_object->term_id == 320 || $q->queried_object->term_id == 321)
            $scffieldname = 'ACF_KEY_2';

        $value = get_ah_value($q, $acffieldname );
        $q->set( 'meta_query', array(
            array(
                'key'     => $acffieldname,
                'compare' => '>',
                'value'   => intval($value), 
                'type'    => 'numeric',
            )
        ) );
        $q->set('orderby', 'meta_value');    
        $q->set( 'order', 'ASC' ); 
    }
}

function get_ah_value($query, $s){
    if (!isset($query->query['p'])) return '';
    $str = get_field($s, $query->query['p']);
    if (empty($str)) return '';
    preg_match_all('/[0-9]+/', $str, $matches);
    $n = $matches[0][0];
    $s = intval($n) < 100 ? '0'.$n : $n;
    return $s;
}

相关问题