是否在两个元值之间进行查询?

时间:2011-01-14 作者:Gerald

如何通过两个自定义元字段(开始日期和结束日期)限制查询?以下是我的数据:

meta_key   | meta_value |
------------------------|
start_date | 20100131   | //Jan 15, 2010
end_date   | 20100206   | //Feb 6, 2010
------------------------\'

$today = date(YYYYMMDD);
帖子将显示start_date = $today 它将在end_date = $today.

使现代化

这是我单曲的结构。php

首先,我用你的答案

<?php
query_posts( $query_string );
if (have_posts()) : while (have_posts()) : the_post();
    ?><a href="<?php the_permalink() ?>"><?php the_title() ?></a><br /><?php
endwhile; endif;
wp_reset_query();
?>
和第二个具有常规wordpress功能的查询,但第二个查询无法正常工作

<?php
query_posts(\'showposts=5&meta_key=start_date&meta_compare=>&meta_value=\'.date("Ymd"));
if (have_posts()) : while (have_posts()) : the_post();
    ?><a href="<?php the_permalink() ?>"><?php the_title() ?></a><br /><?php
endwhile; endif;
wp_reset_query();
?>

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

Edited again to demonstrate adding and removing filters:

将这些常规功能包括在functions.php. 以下是您将为循环调用的过滤器,在这些循环中,您希望通过以下两个元值限制查询:

function date_check_join( $join ) {
    global $wpdb;
    $join .= " JOIN ".$wpdb->postmeta." AS startdate ON 
        (".$wpdb->posts.".ID = startdate.post_id AND
        startdate.meta_key = \'start_date\')
        JOIN ".$wpdb->postmeta." AS enddate ON 
        (".$wpdb->posts.".ID = enddate.post_id AND
        enddate.meta_key = \'end_date\')";
    return $join;
    }

function date_check_where( $where ) {
    $today = date(\'Ymd\');
    $where .= " AND startdate.meta_value <= $today
    AND enddate.meta_value >= $today";
    return $where;
    }
现在,在要包含这些过滤器的页面上,在要过滤的循环之前添加它们,然后删除它们。例如:

add_filter( \'posts_join\', \'date_check_join\' );
add_filter( \'posts_where\', \'date_check_where\' );

query_posts( "yourqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop will only includes where today is between start_date and end_date
endwhile; endif;

query_posts( "anotherqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop also only includes where today is between start_date and end_date
endwhile; endif;

remove_filter( \'posts_join\', \'date_check_join\' );
remove_filter( \'posts_where\', \'date_check_where\' );

query_posts( "thirdqueryhere" );
if (have_posts()) : while (have_posts()) : the_post();
// This loop is not affected by the filters, so you can query for posts 
// where start_date is in the future, or end_date in the past, etc.
endwhile; endif;
您只需在搜索之前将条件添加到“posts\\u join”和“posts\\u where”过滤器中,然后将其删除(否则这些条件将应用于您网站上的所有内容,包括页面、菜单等)

如果可以通过仅比较一个字段来简化此操作,那么可以使用meta_compare attribute 内置于WP\\U查询对象中。您可以为帖子安排开始日期(这样它们就不会提前显示),然后在查询时将日期与结束日期自定义字段进行比较。

SO网友:anu

这个问题的答案是:How to Change Loop to Order Posts by Views (using wp-postviews plugin) 显示如何按自定义字段排序。

查看Codex docs for query\\u posts():http://codex.wordpress.org/Template_Tags/query_posts, 并查看自定义字段部分。

然后,您只需在循环中包含一个测试,以便在($today<;start\\u date或$today>end\\u date)中跳过

结束

相关推荐

mysql query paging

HiI进行了一个sql查询,该查询根据我选择的参数获取多篇文章。我正在显示这些帖子,但是wordpress内部的页面没有任何作用。它显示有更多的页面,但当我选择页码时,它会显示与之前相同的结果。这很有意义,因为它可能会再次运行sql查询。我正在使用WordPress和BuddyPress。如何在这些查询结果之间分页?更新:这是我使用的代码$sql = \"SELECT post_title, post_date, post_excerpt, guid, ID FROM wp_posts,wp_term_t