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

如何实现WordPress文章随短代码动态内容更新自动修改发布日期

WordPress 通用解决方案:根据短代码内容更新自动同步文章发布日期

之前代码的问题分析

两段代码未生效的核心原因如下:

  1. 第一段代码:

    • 未绑定触发钩子(如save_post),函数从未被执行;
    • 短代码匹配错误添加了**符号,无法识别文章中的真实短代码;
    • 触发逻辑错误:仅在手动保存文章时触发,而短代码内容更新源于分类新文章发布,并非手动编辑目标文章。
  2. 第二段代码:

    • 短代码回调未返回任何内容,导致短代码无法显示预期的文章列表;
    • 每次访问文章都会强制更新日期,不符合「短代码内容更新时才同步日期」的需求;
    • 直接修改全局$post对象并更新,存在权限和逻辑风险。

通用解决方案

以下提供两种适配不同场景的方案,可根据你的短代码更新逻辑选择:

场景1:短代码内容随分类新文章更新

当目标分类发布新文章时,自动更新所有包含对应分类短代码的文章发布日期,精准匹配短代码内容变化时机。

核心代码(添加至主题functions.php)

// 分类新文章发布时,同步更新对应短代码文章的日期
function sync_post_date_with_category_update($post_id) {
    // 排除自动保存、修订版和非文章类型
    if (wp_is_post_autosave($post_id) || wp_is_post_revision($post_id) || get_post_type($post_id) !== 'post') {
        return;
    }

    // 获取当前文章所属分类ID
    $categories = wp_get_post_categories($post_id);
    if (empty($categories)) return;

    // 遍历分类,查找所有包含对应短代码的文章
    foreach ($categories as $cat_id) {
        // 匹配短代码格式:[latest_category_posts cat_id="123"]
        $shortcode_pattern = '/\[latest_category_posts.*cat_id\s*=\s*["\']' . preg_quote($cat_id, '/') . '["\'].*\]/i';

        // 先筛选包含短代码关键词的文章,提升查询效率
        $target_posts = new WP_Query([
            'post_type' => 'post',
            'post_status' => 'publish',
            'posts_per_page' => -1,
            's' => '[latest_category_posts'
        ]);

        if ($target_posts->have_posts()) {
            while ($target_posts->have_posts()) {
                $target_posts->the_post();
                $current_post_id = get_the_ID();
                $post_content = get_post_field('post_content', $current_post_id);

                // 精确匹配对应分类的短代码,更新日期
                if (preg_match($shortcode_pattern, $post_content)) {
                    wp_update_post([
                        'ID' => $current_post_id,
                        'post_date' => current_time('mysql'),
                        'post_date_gmt' => current_time('mysql', 1),
                        'post_modified' => current_time('mysql'),
                        'post_modified_gmt' => current_time('mysql', 1)
                    ]);
                }
            }
            wp_reset_postdata();
        }
    }
}
add_action('save_post', 'sync_post_date_with_category_update', 10, 1);

// 配套短代码:显示指定分类最新文章
function latest_category_posts_shortcode($atts) {
    $atts = shortcode_atts([
        'cat_id' => '',
        'posts_per_page' => 5
    ], $atts);

    if (empty($atts['cat_id'])) return '<p>请指定分类ID</p>';

    $latest_posts = new WP_Query([
        'post_type' => 'post',
        'category__in' => [$atts['cat_id']],
        'posts_per_page' => $atts['posts_per_page'],
        'ignore_sticky_posts' => true
    ]);

    $output = '<ul class="latest-category-posts">';
    if ($latest_posts->have_posts()) {
        while ($latest_posts->have_posts()) {
            $latest_posts->the_post();
            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        wp_reset_postdata();
    } else {
        $output .= '<li>暂无文章</li>';
    }
    $output .= '</ul>';
    return $output;
}
add_shortcode('latest_category_posts', 'latest_category_posts_shortcode');

使用说明

  • 短代码格式:[latest_category_posts cat_id="你的分类ID" posts_per_page="5"],替换分类ID即可显示对应分类的最新文章;
  • 当该分类发布新文章时,所有包含此短代码的文章发布日期会自动同步为新文章的发布时间。

场景2:短代码内容定时刷新(每10-20分钟)

若短代码内容通过定时任务而非分类新文章更新,可使用定时检查方案,每15分钟验证短代码内容对应的分类最新文章,同步更新日期。

核心代码(添加至主题functions.php)

// 定时检查分类最新文章,同步更新短代码文章日期
function check_and_sync_shortcode_post_date() {
    $target_posts = new WP_Query([
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        's' => '[latest_category_posts'
    ]);

    if ($target_posts->have_posts()) {
        while ($target_posts->have_posts()) {
            $target_posts->the_post();
            $post_id = get_the_ID();
            $post_content = get_post_field('post_content', $post_id);

            // 提取短代码中的分类ID
            preg_match_all('/\[latest_category_posts.*cat_id\s*=\s*["\'](\d+)["\'].*\]/i', $post_content, $matches);
            if (!empty($matches[1])) {
                foreach ($matches[1] as $cat_id) {
                    // 获取分类最新文章的发布时间
                    $latest_cat_post = get_posts([
                        'category__in' => [$cat_id],
                        'posts_per_page' => 1,
                        'orderby' => 'date',
                        'order' => 'DESC'
                    ]);

                    if (!empty($latest_cat_post)) {
                        $latest_post_date = $latest_cat_post[0]->post_date;
                        $last_recorded_date = get_post_meta($post_id, '_last_cat_post_date_' . $cat_id, true);

                        // 若分类有新文章,同步更新日期
                        if ($latest_post_date > $last_recorded_date) {
                            wp_update_post([
                                'ID' => $post_id,
                                'post_date' => $latest_post_date,
                                'post_date_gmt' => get_gmt_from_date($latest_post_date),
                                'post_modified' => current_time('mysql'),
                                'post_modified_gmt' => current_time('mysql', 1)
                            ]);
                            update_post_meta($post_id, '_last_cat_post_date_' . $cat_id, $latest_post_date);
                        }
                    }
                }
            }
        }
        wp_reset_postdata();
    }
}

// 添加15分钟定时任务间隔
function add_fifteen_minutes_interval($schedules) {
    $schedules['fifteen_minutes'] = [
        'interval' => 900, // 15分钟=900秒
        'display' => __('每15分钟')
    ];
    return $schedules;
}
add_filter('cron_schedules', 'add_fifteen_minutes_interval');

// 启动定时任务
if (!wp_next_scheduled('sync_shortcode_post_date_hook')) {
    wp_schedule_event(time(), 'fifteen_minutes', 'sync_shortcode_post_date_hook');
}
add_action('sync_shortcode_post_date_hook', 'check_and_sync_shortcode_post_date');

使用说明

  • 需确保服务器支持WordPress Cron功能;
  • 代码会每15分钟检查一次短代码对应的分类最新文章,若有更新则同步目标文章的发布日期。

内容的提问来源于stack exchange,提问作者Rakesh Suthar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:47:08