You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:07:47