为WHERE语句问题添加过滤器(_F)

时间:2012-06-21 作者:cj5

我正在尝试获取筛选的帖子的开始和结束日期,我找到了“posts\\u where”过滤器的文档,目前为止我只是在测试它,但每当我添加过滤器时,它似乎会为主导航引入循环数据(即从wp\\u nav\\u menu()中)

我补充道:

<?php remove_filter(\'posts_where\', \'uc_filter_where\'); ?>

<?php wp_nav_menu(array(\'sort_column\' => \'menu_order\', \'menu_class\' => \'nav\', \'theme_location\' => \'primary-menu\')); ?>
试图清除where过滤器中的帖子,但没有这样的运气。任何人都可以向我解释我做错了什么。

1 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

所以首先你要确保WHERE 第条。posts_where 将激发(几乎)每个查询,因此您需要确保将其添加到正确的查询中。这可以通过使用conditional tags.

Note: 这个WHERE 1=1 因为它表示有效的WHERE 表达式,并可以使用posts_where 过滤器(即仅通过添加AND X=Y ). 事实上,WordPress硬编码WHERE 并在条件中添加-因此需要一些东西来确保SQL查询有效

add_filter(\'posts_where\', \'wpse55985_posts_where\',10,2);
function wpse55985_posts_where($where, $query){
    global $wpdb;

    //$query is a WP_Query object

    if( $query->is_main_query() && is_tax(\'my-tax\') ){
         //This is the main query for the \'my-tax\' taxonomy page

         if( isset($_GET[POSTS_END_DATE_NAME]) && isset($_GET[POSTS_START_DATE_NAME]) ){
             //Variables are set.
             $start = $_GET[POSTS_START_DATE_NAME];
             $end = $_GET[POSTS_END_DATE_NAME];

             //Append our additional \'WHERE\' clause
             $where .= $wpdb->prepare(
                 " AND {$wpdb->posts}.post_date BETWEEN %s AND %s ", $start,$end
             ) ;
         }
    }
    return $where
}
解释首先使用is_main_query() 检查此查询是否为页面的“主”查询。这个conditionals 所有都与此主查询相关。因此,我正在检查这是否是主查询,并且该查询是针对分类法“my tax”,尤其是正在查看“my tax”分类法页面。因此,上述内容应仅对my-tax 分类页面。看见is_tax(). 否则,我们只需返回$where 不做任何事情的条款。

检查$_GET 设置您所追求的变量。您应该注册自定义查询变量并使用$query->get() 方法而不是处理$_GET 直接地如果没有设置它们,我们就不会更改查询。

使用$wpdb 类获取post表名称并安全地准备查询。看见this Codex page, 最后一部分this article. 这一部分对于保护自己不受SQL注入的影响至关重要。

请注意,我尚未对此进行测试,可能存在语法错误。

结束

相关推荐

Remove menus and submenus

所以我找到了一些方便的代码片段来帮助删除管理菜单项。但是,我对子菜单项有问题。我想保留外观菜单,但去掉主题、小部件和编辑器。function remove_menus() { global $menu; global $current_user; get_currentuserinfo(); if($current_user->user_login == \'username\') { $restricted = array(__(\'