wordpress 自动为已发布文章生成长尾关键词标签代码版

为了优化代码,避免对服务器造成过大的压力,我们可以对代码进行以下改进:
  1. 限制处理的文章数量:只处理最近发布的文章,而不是所有文章。
  2. 分批处理:将文章分批处理,每次只处理一小部分。
  3. 避免重复处理:为已经添加过长尾标签的文章设置标记,避免重复处理。
  4. 优化关键词提取和组合逻辑:减少不必要的循环和计算。
以下是优化后的代码:
php复制
function generate_seo_friendly_tags($post_id) {
    // 获取文章标题和内容
    $post = get_post($post_id);
    if (!$post) return;

    $title = $post->post_title;
    $content = $post->post_content;

    // 合并标题和内容作为文本基础
    $text = $title . " " . $content;

    // 使用正则表达式提取中文关键词
    preg_match_all('/[x{4e00}-x{9fa5}]+/u', $text, $matches);
    $keywords = array_unique($matches[0]); // 去重

    // 过滤常见词(根据需要自定义)
    $common_words = ['的', '和', '是', '在', '了', '我', '你', '他', '她', '它'];
    $filtered_keywords = array_diff($keywords, $common_words);

    // 生成长尾关键词(组合关键词)
    $long_tail_keywords = [];
    foreach ($filtered_keywords as $keyword) {
        foreach ($filtered_keywords as $another_keyword) {
            if ($keyword !== $another_keyword) {
                $long_tail_keywords[] = $keyword . " " . $another_keyword;
            }
        }
    }

    // 合并关键词和长尾关键词
    $tags = array_merge($filtered_keywords, $long_tail_keywords);

    // 限制标签数量(避免过多标签)
    $max_tags = 20;
    $tags = array_slice($tags, 0, $max_tags);

    // 将生成的标签添加到文章
    wp_set_post_tags($post_id, $tags, false);

    // 设置标记,避免重复处理
    update_post_meta($post_id, 'seo_tags_generated', 'true');
}

// 钩子:在文章保存时执行
add_action('save_post', 'generate_seo_friendly_tags');

// 定时任务:为已发布的文章添加长尾标签
function schedule_seo_friendly_tags_generation() {
    if (!wp_next_scheduled('generate_seo_friendly_tags_for_published_posts')) {
        wp_schedule_event(time(), 'hourly', 'generate_seo_friendly_tags_for_published_posts');
    }
}
add_action('wp', 'schedule_seo_friendly_tags_generation');

function generate_seo_friendly_tags_for_published_posts() {
    // 获取已发布的文章
    $args = [
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => 10, // 每次处理10篇文章
        'meta_query' => [
            [
                'key' => 'seo_tags_generated',
                'compare' => 'NOT EXISTS'
            ]
        ]
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $post_id = get_the_ID();
            generate_seo_friendly_tags($post_id);
        }
        wp_reset_postdata();
    }
}
add_action('generate_seo_friendly_tags_for_published_posts', 'generate_seo_friendly_tags_for_published_posts');

优化点说明:

  1. 分批处理
    • 使用 WP_Query 每次只查询10篇文章(通过 posts_per_page 参数控制),避免一次性处理过多文章。
    • 使用定时任务(wp_schedule_event)每小时运行一次,逐步处理所有文章。
  2. 避免重复处理
    • 使用 update_post_meta 为已处理的文章设置标记(seo_tags_generated),避免重复处理。
  3. 优化关键词组合逻辑
    • 保留了原有的关键词提取和组合逻辑,但通过分批处理减少了单次处理的负担。
通过这些优化,代码在处理已发布文章时对服务器的压力会大大降低。

[自动更新内容]