如果您设计或开发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
中添加其他用于定义查询的参数。
键,值和比较
如上所述,参数key
, value
与meta-key
, meta-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
,当你使用一个逻辑关系要查询的自定义元数据被使用。 您可以使用AND
或OR
。 例如,您将使用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/