根据每个计算过滤WordPress结果

时间:2014-11-07 21:21:41

标签: php wordpress

我正在运行WordPress查询。要确定要显示哪些帖子,需要在每个帖子上运行计算。

使用示例,假设我的所有帖子都有自定义字段“my_custom_field”。该值是1到100之间的整数。

然后用户也输入1到100之间的数字。对于每个帖子,我们从my_custom_field的值中减去用户的数字。结果大于10,我们在结果中显示该帖子。

如何运行该查询?我似乎无法弄清楚这个方向。

请记住,这只是一个复杂问题的简化示例。假设我们实际上需要为每个帖子运行计算。我意识到在这个简单的例子中,你可以解决方程并找出你应该显示的值的范围。这在我的实际使用中不起作用。

以下是我可能想要这样做的一个例子。当然,问题是你无法在$ args数组中实际运行函数和计算。 这仅仅是为了展示我想要实现的目标,我知道这不是$ args数组的工作方式。

$args = array ( $a = get_field('my_custom_field'); //I'm using ACF which uses get_field, not important
                $b = $user_inputted_field //The value the user entered

         Display posts where: $a - $b > 10 //Not real code... Just showing my intention 
);


$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
//Display our posts
}

我已经能够启用或阻止DISPLAYING中的帖子,基本上将我的$ args中的代码放入循环的显示部分,但当然这非常草率,并且分页可怕。

我需要一些方法在WP_Query对象中的每个帖子上运行该计算,并删除所有不符合这些条件的帖子。在实际运行循环之前,如何手动过滤这些结果?

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

$args = array(
 'meta_query'=> array(
   array(
    'key' => 'my_custom_field',
    'compare' => '>',
    'value' => 10, // put here what the user inputs
    'type' => 'numeric',
   )
 ),
 'posts_per_page' => -1
) );

query_posts( $args );

答案 1 :(得分:0)

想出来!基本上,秘密就是运行两个循环。第一个,而不是在循环中显示结果,对每个结果运行计算,然后根据计算的结果,将帖子ID添加到字符串。该字符串稍后用作第二个循环的参数,该循环显示这些精心挑选的帖子。

所以我们的第一个循环看起来像:

$results = array(); //Set up our array, empty for now
$the_query = new WP_Query( $args );


// The Loop
$posts = $the_query->get_posts();

foreach($posts as $post)  {

$a = get_field('my_custom_field'); //I'm using ACF which uses get_field, not important
$b = $user_inputted_field



if ( $a - $b > 10 ) { 

array_push($results, get_the_ID()); //Add the ID of this post to our array

}}        

                    wp_reset_postdata();

然后,对于第二个循环,我们只需要设置$ args数组来利用我们拥有的帖子ID数组。还要注意,我们必须重命名args数组和一些变量,这样它们就不会与我们的第一个循环重叠并导致问题。

$args2 = array(
         'post_type' => 'page', //I'm looking for pages, you might not be
         'post__in' => $results
         );

$the_query2 = new WP_Query( $args2 );


// The Loop
if ( $the_query2->have_posts() ) { 
while ( $the_query2->have_posts() ) {
$the_query2->the_post(); ?>

                //Do something. This is where you would DISPLAY the posts

<?php
} }
/* Restore original Post Data */
wp_reset_postdata();

轰!它就是。它实际上并不太难,如果你以前从未这样做过,很难想到这一点。我的博客上还有一个更深入的例子。在其中,我使用了一个更实际的例子来说明我在这里所做的事情。我执行radial search to find locations near the user。这可能有助于解释为什么你会想要这样做!