使用自定义视图的WP_QUERY

时间:2014-11-01 作者:Annie

我创建了一个Database VIEW 在…上wp_posts 它选择其所有列并显示额外的计算列(平均值)。因此,我的观点与wp_posts 加上一列,我想在以后的阶段使用它进行排序。

有什么方法可以绑定WP_Query 到那个观点WP_Query 到一个自定义表,该表包含WP_Query?我可以通过$wpdb->get_results( _custom_query_here_ ), 但这不允许我使用WP_Query 功能。

P、 S:我想WP_Query::parse() 是我好奇心的答案,但显然不是。

EDIT

以下是视图查询:

CREATE VIEW `calculated_posts`
AS 
  SELECT *, 
         (SELECT Avg(CAST(`meta_value` as SIGNED))
          FROM   `wp_commentmeta` 
          WHERE  meta_key = \'rating\' 
                 AND comment_id IN (SELECT comment_id 
                                    FROM   wp_comments 
                                    WHERE  comment_post_id = ID)) AS 
            rating_average 
  FROM   wp_posts;

Edit 2:

根据@birgire提供的解决方案:https://wordpress.org/support/topic/changing-table-name-and-make-wordpress-still-working, 我使用了以下代码:

global $wpdb;
$wpdb->posts = \'calculated_posts\';
WP\\u查询成功运行,但我无法访问该字段rating_average.

1 个回复
SO网友:birgire

在前端使用自定义视图:

您可以尝试修改SELECT 使用以下(alpha)插件在前端进行查询:

<?php
/**
 * Plugin Name: wpdb - a custom SELECT view for the wp_posts table on the front-end
 * Version:     alpha
 */

! is_admin() && add_filter( \'query\', function( $query ) {
    global $wpdb;
    $view = \'calculated_posts\'; // <-- Edit to your needs.
    if( \'select\' === mb_substr( strtolower( $query ) , 0, 6 ) )
        if( false !== mb_stripos( $query, $wpdb->posts ) )
            $query = str_ireplace( $wpdb->posts, $view, $query );

    return $query;
}, PHP_INT_MAX );
通过使用query 的过滤器wpdb

我们不想修改INSERT, UPDATEDELETE 查询。

这只会影响从本机进行的查询wpdb 类,但不是例如直接调用MySQLi。

请注意,插件和主题当然有可能由本机提供wpdb 连接到数据库时初始化。

也可能有更复杂查询的示例,例如选择和插入的组合。可以修改上述插件以适应这些情况。

Notice: 请记住在尝试之前进行备份。

访问自定义视图的额外字段:

额外字段rating_average 字段现在应在中可用WP_Post 实例,如:

$post->rating_average
我们还可以创建自定义模板标记:

function get_the_rating_average()   
{
    $post = get_post();
    return ! empty( $post ) ? $post->rating_average : false;
}  
这里我只是修改get_the_ID() 作用

相应的显示功能为:

function the_rating_average()   
{
    echo get_the_rating_average();
}  
现在,我们可以轻松访问循环中的额外字段:

$q = new WP_Query( array( \'posts_per_page\' => \'5\' ) );
while( $q->have_posts() ) : $q->the_post();
    the_title();
    the_rating_average();  #<-- displaying our extra field here
endwhile;
我们最好为额外字段使用默认字段尚未使用的名称。

结束

相关推荐

Wpdb::Prepare()用法不正确

我不知道我做错了什么。我没有编写此代码,但我在WordPress中收到以下错误:wpdb::prepare()的查询参数必须有占位符。此消息是在版本3.9中添加的。<?php echo \'<div class=\"client_list\"><input type=\"checkbox\" name=\"check_all\" value=\"0\" class=\"\" id=\"check_all\" /> Check All</