数组中的函数作为WP_QUERY的参数

时间:2016-10-04 作者:Alex

我将此功能硬编码到内容单一产品中。php(WooCommerce),它可以显示来自categories ID 64 and 72:

$args = array(
    \'post_type\'      => \'product\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => \'3\',
    \'orderby\'        => \'rand\',
    \'tax_query\'      => array(
        \'relation\' => \'AND\',
        array(
            \'taxonomy\' => \'product_cat\',
            \'field\'    => \'term_id\',
            \'terms\'    => array( 64, 72 ),
        ),
    ),
);

$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post();
    global $product;
现在,我没有对类别ID进行硬编码,而是在产品中添加了一个自定义字段MyCustomField 并写道64,72 在里面。然后我尝试修改上述代码以动态填充:

$MyCustomField = get_post_meta($post->ID, \'MyCustomField\', true);

$args = array(
    \'post_type\'      => \'product\',
    \'post_status\'    => \'publish\',
    \'posts_per_page\' => \'3\',
    \'orderby\'        => \'rand\',
    \'tax_query\'      => array(
        \'relation\' => \'AND\',
        array(
            \'taxonomy\' => \'product_cat\',
            \'field\'    => \'term_id\',
            \'terms\'    => array( $MyCustomField ),
        ),
    ),
);

$loop = new WP_Query( $args );

while ( $loop->have_posts() ) : $loop->the_post();
    global $product;
不幸的是,这无法正常工作:

\'terms\' => array( $MyCustomField )

因为它只显示第一个类别(ID 64)的产品,而不是我想要的两个类别的产品。

我是个程序员新手,我做错了什么?谢谢

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

我怀疑问题来自$MyCustomField 您在以下内容中输入:

\'terms\' => array( $MyCustomField ),
查询仅将其视为一个值:\'64,72\', 字符串。

因此,请尝试:

$MyCustomFieldValues = array_map( \'intval\', explode( \',\', $MyCustomField ) );
这也将确保您的值是整数。

然后:

\'terms\' => $MyCustomFieldValues,

SO网友:sMyles

来自WordPress codex:

关系(字符串)—当存在多个内部分类法数组时,每个内部分类法数组之间的逻辑关系。可能的值为“AND”、“OR”。不要与单个内部分类法数组一起使用。

其他事情也很少,您应该将值作为数组保存到自定义元中,WordPress将自动序列化该值:

使用update_post_meta 将自动序列化传递给它的任何数组:

update_post_meta( $post_id, \'MyCustomField\', array( 64, 72 ) );
然后,您可以在提取值时取消序列化:

$MyCustomField = maybe_unserialize( get_post_meta( $post->ID, \'MyCustomField\', TRUE ) );
在进行WP\\u查询调用之前,您可能还应该检查以确保有一个值

if( ! empty( $MyCustomField ) ){

    $args = array(
        \'post_type\'      => \'product\',
        \'post_status\'    => \'publish\',
        \'posts_per_page\' => \'3\',
        \'orderby\'        => \'rand\',
        \'tax_query\'      => array(
            array(
                \'taxonomy\' => \'product_cat\',
                \'field\'    => \'term_id\',
                \'terms\'    => $MyCustomField,
            ),
        ),
    );

}
如果您的计划是通过WP Admin界面添加这些值(意味着您想输入CSV),那么您应该使用@ClemC方法,并使用explode, 具有array_map 转换为整数的步骤

SO网友:C C

如果要将文本(字符串)“64,72”传递给需要整数数组的函数,则需要将该传入字符串转换为整数数组。尝试在$args = 声明:

$MyCustomField = array_map(\'intval\', explode(\',\', $MyCustomField));

相关推荐

如何在wp-Query中比较不同的时间戳以获取事件自定义帖子类型?

我有一个带有自定义元数据库的自定义帖子类型(as seen on wptheming.com) 并且希望进行查询以显示即将发生的事件,例如在侧边栏中,过去的日期被忽略。但我需要一个当前时间的值来和事件开始时间进行比较。现在我从current_time(\'mysql\') 看起来是这样的:2012-02-16 13:15:31元的开始时间如下所示:201108121100如何使这两个日期具有可比性?我可以在查询中执行吗?或者是否有其他解决方案?以下是我到目前为止的查询(值留空,时间戳回显):<?ph