从wp_query中排序meta_value,但在排序之前删除特殊字符

时间:2012-07-10 20:17:55

标签: php mysql wordpress

我有一个插件可以在搜索页面和分类页面上对帖子进行排序。循环已经处理了缩小结果的范围,所以我需要的是能够对帖子进行排序我的自定义元值。在这种情况下价格。我希望能够进入现有查询,替换任何特殊字符,然后根据干净元值进行排序。

我使用了这个选择,但问题是它查询数据库上的所有帖子而不是wp_query中找到的结果,这可能会大大减慢排序

function join_it( $join ) {
global $wpdb;
    $sym = get_option('sort_by_ignore');
    $join .= "LEFT JOIN (SELECT $wpdb->prefix" . "postmeta.post_id AS ID, CAST(REPLACE(REPLACE(REPLACE($wpdb->prefix" . "postmeta.meta_value, ',', ''), '" . $sym . "',''),' ','') AS SIGNED) AS price FROM $wpdb->prefix" . "postmeta WHERE meta_key = 'my_price'" . ") P ON (P.ID = wp_posts.ID)";

return $join;
}
add_filter('posts_join', 'join_it' );

$args = array_merge( $wp_query->query, array('caller_get_posts' => 1,'paged' => $paged ));

        query_posts($args);

1 个答案:

答案 0 :(得分:1)

如果您仅将其用于排序,则最好使用posts_orderby过滤器,而不是posts_join

如果您发现过滤器影响了其他查询,则可以在需要的地方运行remove_filter

我的回答here做了一些含糊不清的事情(没有使用replace函数清除值 - 我认为你不得不把它留在那里。)