基于自定义字段的自定义循环/查询

Jason Witt最近更新。

如果您设计或开发WordPress主题或插件,则很有可能有一天需要查询自定义元字段。 这些是您可以附加到任何帖子,页面或自定义帖子类型的完全自定义键/值对。 WordPress默认情况下具有基本的UI,或者您可以使用“ 高级自定义字段”之类的东西来欣赏它们。 但在幕后,ACF使用常规的自定义字段。

您现在要看的这段非常简短的页面是在1999年编写的。当时,要查询具有特定自定义字段的帖子,您需要使用$ wpdb`全局变量。 可用于创建WordPress WP_Query()类不支持的MySQL查询。 幸运的是,今天WordPress确实具有支持自定义元字段查询的参数。

在这里,我们将介绍您请求和循环具有特定自定义字段(及其值)的帖子的不同方式。 无论您使用WP_Query类, query_posts()还是get_posts() ,您都可以使用此信息。 由于query_posts()get_posts()WP_Query类的包装器。 他们都接受相同的论点。

查询参数

这是取自WordPress Codex的WordPress查询的基本示例。

<?php
// The Query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
  echo '<ul>';
  while ( $the_query->have_posts() ) {
    $the_query->the_post();
    echo '<li>' . get_the_title() . '</li>';
  }
  echo '</ul>';
} else {
  // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

$args是那里的重要位。 我们将传递不同的参数,以使此工作如我们所愿。

在查询自定义元数据时,可以使用两个“组”参数。 一组用于简单的自定义元字段查询,另一组用于更复杂的自定义元字段查询。 让我们从简单的组开始。

meta_key

meta_key参数将查询任何已将自定义字段元ID保存到数据库的帖子,无论是否为该字段保存了值。 meta_key是您提供给元字段的ID。 像这样:

此示例将查询任何具有ID为“ field1”的自定义元字段的帖子。

$args = array( 'meta_key' => 'field1' );
meta_value

meta_value参数查询具有您定义的值的帖子。 meta_value参数用于字符串值。 本示例将查询带有自定义元字段的任何帖子,该字段的值为“ data1”。

$args = array( 'meta_value' => 'data1' );

您也可以将两者结合起来。 本示例将仅查询ID为“ field1”且自定义元字段值为“ data1”的帖子。

$args = array(
  'meta_key'   => 'field1', 
  'meta_value' => 'data1'
);
meta_value_num

meta_value_num参数类似于`meta_value`参数。 其中meta_value参数是用于字符串值的meta_value_num是用于数字值的。

本示例说明了如何查询“ field1”自定义元字段(如果其值为“ 10”)。

$args = array(
  'meta_key'       => 'field1', 
  'meta_value_num' => '10',
);
meta_compare

meta_compare参数确实听起来像。 它将允许您使用带有`meta_value`和`meta_value_num`参数的比较器。 可以使用的比较器是'=','!=','>','> =',' $args = array( 'meta_key' => 'field1', 'meta_value' => 'data1', 'meta_compare' => '!=', );

更复杂的查询

meta_query

用于复杂查询的主要参数是meta_query 。 该参数本身不会执行任何操作。 它只是告诉WordPress您要查询自定义元字段。 您将在meta_query中添加其他用于定义查询的参数。

键,值和比较

如上所述,参数keyvaluemeta-keymeta-value工作方式完全相同。 复杂的compare与上面的简单compare相似,但是它使用了不同的比较器列表。 复杂的compare使用'=','!=','>','> =','值可以是数组,但仅当比较使用'IN','NOT IN','BETWEEN'或'不在之间。

如果将“ EXISTS”或“ NOT EXISTS”与compare ,则无需指定value参数。

这是一个示例,它将查询帖子是否具有值为“ data1”的“ field1”和值为“ data2”的“ field2”。

$args = array(
  'meta_query' => array(
    array(
      'key'   => 'field1',
      'value' => 'data1'
    ),
    array(
      'key'     => 'field2',
      'value'   => 'data2',
      'compare' => '!=',
    )
  ) 

);
关系

relation ,当你使用一个逻辑关系要查询的自定义元数据被使用。 您可以使用ANDOR 。 例如,您将使用AND来比较data1和data2是否满足条件,如果数据1或data2满足条件,则使用OR

此参数是独立的。 这意味着它不会出现在单个自定义元字段参数中。 让我们来看一个例子。 本示例将仅查询值为“ data1”为“ field1”,值为“ data2”为“ field2”的帖子。

$args = array(
  'meta_query' => array(
    'relation' => 'AND'
    array(
      'key'   => 'field1', 
      'value' => 'data1',
    ),
    array(
      'key'   => 'field2', 
      'value' => 'data2',
    ),
  )
);

如果您将relation更改为“ OR”。 然后,如果“ field1”的值为“ data1”,或者“ field2”的值为“ data2”,它将查询所有帖子。

类型

使用type参数可以选择要查询的数据类型。 您可以使用“ NUMERIC”,“ BINARY”,“ CHAR”,“ DATE”,“ DATETIME”,“ DECIMAL”,“ SIGNED”,“ TIME”或“ UNSIGNED”。

仅当日期格式为“ YYYYMMDD”时,“ DATE”类型才能与compare “ BETWEEN”一起使用。

本示例将查询“ field1”的值为数字的任何帖子。

$args = array(
  'meta_query' => array(
    array(
      'key'   => 'field1', 
      'value' => 'data1',
      'type' => 'NUMERIC'
    )
  )
);

真实的例子

到目前为止,我仅给出了带有任意数据和字段的示例。 现在,我想向您展示一个查询自定义元字段的真实示例。

场景

您已经创建了事件自定义帖子类型。 事件发布类型具有ID为event_date的日期自定义字段。 您想要创建一个查询,该查询将显示从当前日期开始到未来30天的所有事件。

我们将使用meta_query参数,因为我们想使用type参数将“ event_date”字段定义为“ DATE”数据类型。

这是查询:

$args = array(
  'post_type'      => 'post',
  'posts_per_page' => -1,
  'post_status'    => 'publish',
  'meta_query'     => array(
    array(
      'key'     => 'event_date',
      'value'   => array( date( 'Ymd', strtotime( '-1 day' ) ), date( 'Ymd', strtotime( '+31 days' ) ) ),
      'compare' => 'BETWEEN',
      'type'    => 'DATE'
    ) 
  )
);
$event_query = new WP_Query( $args );

value是当前日期的数组-从当前日期起1天和31天。 由于我们使用的是比较器“ BETWEEN”,因此仅查询值数组之间的帖子,因此我们希望将它们抵消一天。

使用此查询,您将显示未来30天内发生的所有事件。

结论

WP_Query类是一个非常灵活的类,它将允许您创建许多自定义查询。 如果要了解有关可用于查询的不同参数的更多信息,建议您浏览WP_Query Codex页面

翻译自: https://css-tricks.com/snippets/wordpress/custom-loop-based-on-custom-fields/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值