按自定义字段值获取帖子

时间:2019-09-01 作者:Sergey

我需要得到一个价格低于或等于例如“1000”的帖子。价格在任意自定义字段中设置。试图发布低于或等于1000的价格

$posts = new WP_Query( {
  \'post_type\'  => \'post\',
  \'meta_query\' => array(
    \'key\'     => \'price\',
    \'compare\' => \'<=\',
    \'value\'   => 1000
  ),
} );
希望得到价格为1000、999、998等的帖子。

问题是已经创建了许多帖子,其中价格的设置方式是在开头添加“from 1000”等词。有些人只是简单地给了1000个数字。”值“”与存在字符串的数字进行比较,结果不正确。

有没有什么办法把帖子弄对?或者我需要从自定义字段价格中删除行吗?

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

first, you have to loop through all posts that have this meta key (your custom field) and then update post meta with replacing the word (from) to leave the number alone in the meta value.

//paste the following code in your plugin or theme functions.php
add_action( \'init\', function () {
    if ( ! get_option( \'prefix_correct_data\' ) ) {
        $metakey = \'YOUR_META_KEY\';
        $loop    = new WP_Query( [
            \'meta_query\' => array(
                array(
                    \'key\' => $metakey,
                ),
            )
        ] );
        if ( $loop->have_posts() ) {
            while ( $loop->have_posts() ) {
                $loop->the_post();
                $old_meta = get_post_meta( get_the_ID(), $metakey, true );
                update_post_meta( get_the_ID(), $metakey, str_replace( \'from\', \'\', $old_meta ) );
            }
        }
        update_option( \'prefix_correct_data\', 1 );
        wp_reset_postdata();
    }
} );

this code cleans the meta value from the word (from). just change the meta key variable with yours

then you can run your wp_query

$posts = new WP_Query( [
    \'post_type\'  => \'post\',
    \'meta_query\' => array(
        \'key\'     => \'price\',
        \'compare\' => \'<=\',
        \'value\'   => 1000
    ),
] );

make sure to write the word (from) as you will find in the saved custom fields.

-- the first function will run one time only and you will have to change the option key to run it again --

SO网友:Michelle

您可以使用WP\\u Meta\\u Query查询值和类型:

value (字符串|数组)-自定义字段值。只有当比较为“IN”、“NOT IN”、“BETWEEN”或“NOT BETWEEN”时,它才可以是数组。在WordPress 3.9及更高版本中使用“EXISTS”或“NOT EXISTS”比较时,无需指定值。

type (字符串)-自定义字段类型。可能的值为“NUMERIC”、“BINARY”、“CHAR”、“DATE”、“DATETIME”、“DECIMAL”、“SIGNED”、“TIME”、“UNSIGNED”。默认值为“CHAR”。

$args = array(
    \'relation\' => \'OR\', // Optional, defaults to "AND"
    array(
        \'key\'     => \'_key\',
        \'value\'   => \'Value\',
        \'compare\' => \'=\'
    )
);
$meta_query = new WP_Meta_Query( $args );

SO网友:santamanno

恐怕这需要在DB级别上解决。

如果您有一个错误前缀的列表,如“from”、“sale”等,您应该使用以下内容更新Posteta表:

UPDATE wp_postmeta SET meta_value = TRIM(REPLACE(\'from \', \'\', meta_value)) WHERE meta_key = \'price\';
对于每个前缀,应执行上述行。