WordPress 文章查询教程9:如何使用自定义字段(post meta)参数

在 WordPress 中,使用 WP_Query 进行文章查询是最常见的操作,学习好这方面的操作, WordPress 开发基本就学会了一半。

「WordPress果酱」将通过一系列教程讲解如何使用 WP_Query 进行 WordPress 文章查询。

我写这一系列文章的目的也是为了方便自己使用这些参数的时候方便查询,所以如果你也是经常进行 WordPress 二次开发的话,建议收藏本文。

第九讲关于自定义字段相关的参数,自定义字段相关的参数可以让你获取特定自定义字段的文章,相关的参数比较多,首先基本的参数:

  • meta_key (string) – 自定义字段的 key。
  • meta_value (string) – 自定义字段的 value。
  • meta_value_num (number) – 自定义字段的 value,但是必须是数字型。
  • meta_compare (string) – 用于比较 'meta_value' 值的操作符,支持的操作符有:'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP' 和 'RLIKE',默认是 '='。
  • meta_query (array) – 自定义字段数组参数。
    • relation (string) – 用于定义多个内嵌 meta_query 数组之间的关系,它的值是:'AND', 'OR'。只有一个内嵌 meta_query 数组参数的时候,不要使用该参数。

meta_query 还包含一个或者多个具有以下键值的数组:

  • key (string) – 自定义字段的 key。
  • value (string|array) – 自定义字段的 value。如果 compare 的值是 'IN''NOT IN''BETWEEN', 和'NOT BETWEEN' 这几种情况,它可以是数组,如果 compare 的值是 'EXISTS' 和 'NOT EXISTS',就无须指定值。
  • compare (string) – 用于比较的操作符,支持的操作符有:'=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' 和 'NOT EXISTS',默认是 '='。
  • type (string) – 自定义字段的类型,支持的类型有:'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME' 和 'UNSIGNED',默认是 'CHAR'。

仅当日期以 YYYY-MM-DD 格式存储并使用此格式进行测试时,DATE 的 type 才能与 BETWEEN 的 compare 一起使用。

重要提示:meta_query 的参数应该是一个 meta query 的数组的数组,它让你可以通过最外层数组的 relation 参数来定义关系。

简单自定义字段查询

获取自定义字段的 key 是 'color',而 value 则任意值都可的文章:

$query = new WP_Query( array( 'meta_key' => 'color' ) );

获取自定义字段的 value 是 'blue',而 key 则任意值都可的文章:

$query = new WP_Query( array( 'meta_value' => 'blue' ) );

获取自定义字段的 value 是 'blue',而 key 则任意值都可的页面:

$args = array(
    'meta_value' => 'blue',
    'post_type'  => 'page'
);
$query = new WP_Query( $args );

获取自定义字段的 key 是 'color' 并且 value 是 'blue' 的文章:

$args = array(
    'meta_key'   => 'color',
    'meta_value' => 'blue'
);
$query = new WP_Query( $args );

获取自定义字段的 key 是 'color' 并且 value 不是 'blue' 的文章:

$args = array(
    'meta_key'   => 'color',
    'meta_value' => 'blue',
    'meta_compare' => '!='
);
$query = new WP_Query( $args );

获取自定义字段 key 为设定日期且 value 为现在的文章,就是显示还未过期的活动:

$args = array(
    'post_type'    => 'event',
    'meta_key'     => 'event_date',
    'meta_value'   => date( "Ymd" ), // change to how "event date" is stored
    'meta_compare' => '>',
);
$query = new WP_Query( $args );

获取其中自定义字段键为“价格”,小于或等于 22 的商品:

$args = array(
    'meta_key'     => 'price',
    'meta_value'   => '22',
    'meta_compare' => '<=',
    'post_type'    => 'product'
);
$query = new WP_Query( $args );

使用 'meta_value' 参数的时候,值 99 将被视为大于 100,因为数据默认为“字符串”,而不是“数字”,如果是要对数字进行比较,请使用 'meta_value_num' 参数。

通过一个自定义字段使用 meta_query 获取文章

$args = array(
    'post_type'  => 'product',
    'meta_query' => array(
        array(
            'key'     => 'color',
            'value'   => 'blue',
            'compare' => 'NOT LIKE',
        ),
    ),
);
$query = new WP_Query( $args );

特别注意下,使用 meta_query 的时候,需要传递嵌套数组,即使只有一个自定义字段查询的时候,也是一样。

通过多个自定义字段使用 meta_query 获取文章

获取 meta key 'color' NOT LIKE 'blue' 或者 'price' BETWEEN 20 和 100 之间。

$args = array(
    'post_type'  => 'product',
    'meta_query' => array(
        array(
            'key'     => 'color',
            'value'   => 'blue',
            'compare' => 'NOT LIKE',
        ),
        array(
            'key' => 'price',
            'value'   => array( 20, 100 ),
            'type'    => 'numeric',
            'compare' => 'BETWEEN',
        ),
    ),
);
$query = new WP_Query( $args );

'meta_query' 支持多重嵌套,以便构建复杂的查询,比如获取 color=orange 或者 color=red&size=small 的商品:

$args = array(
    'post_type'  => 'product',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'color',
            'value'   => 'orange',
            'compare' => '=',
        ),
        array(
                'relation' => 'AND',
                array(
                        'key' => 'color',
                        'value' => 'red',
                        'compare' => '=',
                ),
                array(
                        'key' => 'size',
                        'value' => 'small',
                        'compare' => '=',
                ),
        ),
    ),
);
$query = new WP_Query( $args );

©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。