WordPress新手求助:通过函数添加元数据实现WP ULike投票数排序
按WP ULike投票数排序文章的正确解法
先帮你梳理下当前代码的核心问题:
- 你定义的
votecount()函数是直接输出投票数,而非返回值,没法直接赋值给变量存到post meta里 add_post_meta($post_id, 'votecount', $votecount)这段代码没有绑定任何钩子,直接执行时$post_id根本没定义,而且你传的$votecount是函数名,不是调用函数后的结果- 其实完全没必要手动把投票数存到自定义meta里——WP ULike本身已经把投票数存在默认的post meta字段里了,直接用它排序更省心
方法一:直接用WP ULike内置字段排序(推荐)
WP ULike默认把文章的投票数存在_wp_ulike_count这个post meta键里,你可以直接在WP_Query的参数里指定排序规则:
<?php $args = array( 'post_type' => 'ico', 'posts_per_page' => 10, // 替换成你需要的数量 'orderby' => 'meta_value_num', // 按数字类型的meta值排序 'meta_key' => '_wp_ulike_count', // WP ULike默认投票数字段 'order' => 'DESC' // 从高到低排序,要升序就改成ASC ); $ico_query = new WP_Query($args); if ($ico_query->have_posts()) { $ctr = 1; while ($ico_query->have_posts()) { $ico_query->the_post(); // 输出你需要的内容,比如标题+投票数 echo "<div>{$ctr}. " . get_the_title() . " - 投票数:" . wp_ulike_get_post_likes(get_the_ID()) . "</div>"; $ctr++; } wp_reset_postdata(); // 重置查询,避免影响后续内容 } ?>
这个方法的好处是不用自己维护投票数的同步,插件会自动更新_wp_ulike_count的值,不会出现数据不一致的问题。
方法二:自定义meta字段同步投票数(如果确实需要)
如果你一定要把投票数存到自己的votecount字段里,那得修正代码逻辑,确保在文章保存或投票变化时同步数值:
1. 先写一个获取投票数的函数(返回值而非输出)
<?php function get_custom_votecount($post_id) { // 检查插件是否激活 if (function_exists('wp_ulike_get_post_likes')) { return wp_ulike_get_post_likes($post_id); } return 0; // 插件未激活时返回默认值 } ?>
2. 绑定钩子同步meta值
绑定save_post钩子在文章保存时同步,同时绑定WP ULike的wp_ulike_after_process钩子在投票发生变化时立即更新:
<?php // 文章保存时同步投票数 add_action('save_post', 'sync_votecount_meta', 10, 2); function sync_votecount_meta($post_id, $post) { // 跳过自动保存和修订版 if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) { return; } // 只针对ico类型的文章 if ($post->post_type !== 'ico') { return; } $votecount = get_custom_votecount($post_id); // 用update_post_meta,不存在则自动添加,存在则更新 update_post_meta($post_id, 'votecount', $votecount); } // 投票发生变化时立即同步 add_action('wp_ulike_after_process', 'sync_votecount_on_vote', 10, 4); function sync_votecount_on_vote($type, $status, $id, $count) { // 只处理ico类型的文章投票 if ($type === 'post' && get_post_type($id) === 'ico') { update_post_meta($id, 'votecount', $count); } } ?>
3. 查询时按自定义meta排序
<?php $args = array( 'post_type' => 'ico', 'posts_per_page' => 10, 'orderby' => 'meta_value_num', 'meta_key' => 'votecount', 'order' => 'DESC' ); $ico_query = new WP_Query($args); // 循环输出逻辑和方法一一致 ?>
最后提醒
优先用方法一,因为自定义同步可能会因为钩子触发时机、插件更新等问题导致数据不一致,而直接用插件自带的字段最稳定。
内容的提问来源于stack exchange,提问作者Urek Mazino
相关产品推荐
相关产品推荐

