为作者的所有帖子添加自定义字段值
Add a custom field value for all of an Author's posts
我正在尝试为每位作者的所有 post 添加一个自定义字段值,并将其显示在作者的个人资料页面上。
我创建了一个“赞”按钮功能,当用户喜欢 post 时,它会将 +1 添加到 post 自定义字段 _post_like_count
所以如果 post 10个赞_post_like_count
中的值为10。
我要做的是将每个作者的所有 post 加起来,他们所有 post 的总点赞数加起来,如果他们有 5 posts,每个有10个赞,每个总值应该是50。
$author_posts = get_posts( array('author' => $author->ID) ); // Author's ID
$total_like_count = 0; // needed to collect the total sum of likes
foreach ( $author_posts as $post ) {
$likes = absint( get_post_meta( $post->ID, '_post_like_count', true ) );
$total_like_count += $likes;
}
这是我正在使用的 php,我认为它应该有效,它对某些作者有效,但对其他作者无效,因为我有一些作者应该有 1000 多个赞,而且它显示 77,如果作者只有 1 post 和 17 个赞,它会正确显示。
关于我在顶行尝试做的一些事情,我得到了 post 作者的 ID,然后我 运行 foreach 得到每个 post并将元字段值存储在 $likes 变量中,然后在 $total_like_count 的底行向上计算它,这应该是作者 post 的所有喜欢的总和。
您的 get_posts()
函数仅提取该作者的 10 篇最新帖子(或您设置为每页默认帖子的任何数量)。添加 'nopaging' => true
以获取作者的所有帖子。
此外,如果您在循环内执行此操作,则在 foreach 循环中使用 $post
可能会出现问题。尝试将其切换为 $author_post
之类的内容,然后使用:
$likes = absint( get_post_meta( $author_post->ID, '_post_like_count', true ) );
您的问题可以通过将 posts_per_page
设置为 -1
来解决,但我很想 运行 自定义数据库查询。这样做的好处是您只需 运行ning 一个 SQL 查询。
通过使用 get_posts
,您每次调用 get_post_meta
时都会 运行 进行 SQL 查询,这是非常低效的。如果一个作者有 10 篇文章,您可能不会注意到它,但是一旦您发表了数百篇文章,影响就会很明显。
示例:
function wpse_get_author_like_count( $author_id ) {
global $wpdb;
$like_count = $wpdb->get_var( $wpdb->prepare( "
SELECT SUM( mt.meta_value )
FROM {$wpdb->postmeta} AS mt
LEFT JOIN {$wpdb->posts} p ON p.ID = mt.post_id
WHERE mt.meta_key = '_post_like_count'
AND p.post_type = 'post',
AND p.post_status = 'publish'
AND p.post_author = %d
", $author_id ) );
return (int) $like_count;
}
然后要使用它你会写:
$author_like_count = wpse_get_author_like_count( 10 ); // replacing this with the correct author ID of course.
顺便说一句,这是即时编码的,所以我不能保证它完全准确。我很想知道结果。
我正在尝试为每位作者的所有 post 添加一个自定义字段值,并将其显示在作者的个人资料页面上。
我创建了一个“赞”按钮功能,当用户喜欢 post 时,它会将 +1 添加到 post 自定义字段 _post_like_count
所以如果 post 10个赞_post_like_count
中的值为10。
我要做的是将每个作者的所有 post 加起来,他们所有 post 的总点赞数加起来,如果他们有 5 posts,每个有10个赞,每个总值应该是50。
$author_posts = get_posts( array('author' => $author->ID) ); // Author's ID
$total_like_count = 0; // needed to collect the total sum of likes
foreach ( $author_posts as $post ) {
$likes = absint( get_post_meta( $post->ID, '_post_like_count', true ) );
$total_like_count += $likes;
}
这是我正在使用的 php,我认为它应该有效,它对某些作者有效,但对其他作者无效,因为我有一些作者应该有 1000 多个赞,而且它显示 77,如果作者只有 1 post 和 17 个赞,它会正确显示。
关于我在顶行尝试做的一些事情,我得到了 post 作者的 ID,然后我 运行 foreach 得到每个 post并将元字段值存储在 $likes 变量中,然后在 $total_like_count 的底行向上计算它,这应该是作者 post 的所有喜欢的总和。
您的 get_posts()
函数仅提取该作者的 10 篇最新帖子(或您设置为每页默认帖子的任何数量)。添加 'nopaging' => true
以获取作者的所有帖子。
此外,如果您在循环内执行此操作,则在 foreach 循环中使用 $post
可能会出现问题。尝试将其切换为 $author_post
之类的内容,然后使用:
$likes = absint( get_post_meta( $author_post->ID, '_post_like_count', true ) );
您的问题可以通过将 posts_per_page
设置为 -1
来解决,但我很想 运行 自定义数据库查询。这样做的好处是您只需 运行ning 一个 SQL 查询。
通过使用 get_posts
,您每次调用 get_post_meta
时都会 运行 进行 SQL 查询,这是非常低效的。如果一个作者有 10 篇文章,您可能不会注意到它,但是一旦您发表了数百篇文章,影响就会很明显。
示例:
function wpse_get_author_like_count( $author_id ) {
global $wpdb;
$like_count = $wpdb->get_var( $wpdb->prepare( "
SELECT SUM( mt.meta_value )
FROM {$wpdb->postmeta} AS mt
LEFT JOIN {$wpdb->posts} p ON p.ID = mt.post_id
WHERE mt.meta_key = '_post_like_count'
AND p.post_type = 'post',
AND p.post_status = 'publish'
AND p.post_author = %d
", $author_id ) );
return (int) $like_count;
}
然后要使用它你会写:
$author_like_count = wpse_get_author_like_count( 10 ); // replacing this with the correct author ID of course.
顺便说一句,这是即时编码的,所以我不能保证它完全准确。我很想知道结果。