如何添加/更新帖子元以在查询中使用?

时间:2018-12-09 作者:sh.dehnavi

我发现了一个评分系统,用户可以在评论时对帖子进行评分。一切都很好,但我想use the average rating of posts 根据平均评分(事实上be able to query).<我不知道我怎么能做到
rating\\u键和rating\\u值将保存在wp_commentmeta 表,但我想保存中每个帖子的平均评分值wp_postmeta 能够基于它查询帖子<我可以得到每个帖子的平均评分,但是I do not how to save and update it in wp_postmeta as a special key (如avg\\U post):

<?php
$results = $wpdb->get_results("SELECT meta_value FROM wp_commentmeta WHERE meta_key = \'rating\' ");
foreach($results as $result){
    $rate = $result->meta_value;
    $sum +=$rate;
}
$res = $sum/count($results);
$res = number_format((float)$res,1,\'.\',\'\');
?>

Update:

我在自定义注释模板中创建了新字段,以便:

add_action(\'comment_form_logged_in_after\',\'additional_fields\');
add_action(\'comment_form_after_fields\',\'additional_fields\');
function additional_fields(){
?>
<p class="comment-form-rating">
    <label for="rating">Rating</label>
    <span class="starRting">
    <?php
        for($i=5;$i>=1;$i--)
            echo \'<input id="rating\'.$i.\'" type="radio" name="rating" value="\'.$i.\'"><label for="rating\'.$i.\'"></label>\';
    ?>
    </span>
</p>
然后我将评级值保存在comment_meta :

function save_comment_meta_phone($comment_id){
    if(!empty($_POST[\'rating\']))
        $rating = sanitize_text_field($_POST[\'rating\']);
        add_comment_meta($comment_id,\'rating\',$rating);
}
add_action(\'comment_post\',\'save_comment_meta_phone\');
But I need 用于计算每个帖子的平均评分并将其保存在中的函数post_meta 通过钥匙。

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

您可以使用此函数,将其添加到主题的functions.php 文件,以更新保存在名为_avg_rating (但您当然可以重命名它)&mdash;私有元的名称以下划线开头(_):

function update_post_avg_rating( $comment_id, $post_id = 0 ) {
    if ( ! $post_id ) {
        if ( ! $comment = get_comment( $comment_id ) ) {
            return false;
        }

        $post_id = $comment->comment_post_ID;
    }

    // Retrieve the ID of all rating comments in post $post_id.
    $ids = get_comments( [
        \'meta_key\' => \'rating\',
        \'post_id\'  => $post_id,
        \'fields\'   => \'ids\',
        \'status\'   => \'all\',
    ] );

    // Calculate the average rating (using a custom MySQL query).
    $avg = 0;
    if ( ! empty( $ids ) ) {
        global $wpdb;

        $avg = $wpdb->get_var( "
            SELECT AVG(meta_value + 0) FROM {$wpdb->prefix}commentmeta
            WHERE meta_key = \'rating\'
                AND comment_id IN (" . implode( \',\', $ids ) . ")
        " );
    }

    // Update the average rating.
    update_post_meta( $post_id, \'_avg_rating\', $avg );
}
然后在保存后评价后调用该函数,如下所示:

function save_comment_meta_phone( $comment_id ) {
    if ( ! empty( $_POST[\'rating\'] ) ) {
        $rating = sanitize_text_field( $_POST[\'rating\'] );

        // Save the post rating.
        add_comment_meta( $comment_id, \'rating\', $rating );

        // Then update the average rating.
        update_post_avg_rating( $comment_id );
    }
}
顺便说一句,您可能需要重命名save_comment_meta_phone() 功能到save_comment_meta_rating?.. (只是一个建议)

update_post_avg_rating() 代码,在get_comments() 呼叫,您可以设置statusapprove 如果您只想包括已批准的后期评级。

已删除更新,但您始终可以查看答案的修订

已删除更新#2,但您始终可以查看答案的修订

更新#3

希望这些可以帮助您使用_avg_rating 元数据:

要显示单个帖子的平均评分,您可以使用get_post_meta() 像这样:

$avg_rating = get_post_meta( get_the_ID(), \'_avg_rating\', true );
$avg_rating = $avg_rating ? number_format_i18n( $avg_rating, 1 ) : 0;
echo $avg_rating;
  • _avg_rating meta,但仍包括不具有_avg_rating meta,可以使用键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键控键meta_query 像这样:

    $q = new WP_Query( array(
        \'post_type\'  => \'post\',
        \'meta_query\' => array(
            \'relation\'          => \'OR\',
            \'avg_rating_clause\' => array(
                \'key\'     => \'_avg_rating\',
                \'compare\' => \'EXISTS\',
                \'type\'    => \'DECIMAL\',
            ),
            \'avg_rating_clause2\' => array(
                \'key\'     => \'_avg_rating\',
                \'compare\' => \'NOT EXISTS\',
                \'type\'    => \'DECIMAL\',
            ),
        ),
        \'orderby\'    => array(
            \'avg_rating_clause2\' => \'DESC\',
            \'date\'               => \'DESC\',
        ),
        //...
    ) );
    
    // Sample for displaying the posts.
    if ( $q->have_posts() ) {
        while ( $q->have_posts() ) {
            $q->the_post();
    
            $avg_rating = get_post_meta( get_the_ID(), \'_avg_rating\', true );
            $avg_rating = $avg_rating ? number_format_i18n( $avg_rating, 1 ) : 0;
    
            the_title( \'<h2>\', \' (Avg. Rating: \' . $avg_rating . \')</h2>\' );
        }
    }
    
    请参见here 有关meta_query.

  • 相关推荐

    列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

    这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在