WordPress插件:文章ID连续无空ID,让文章管理更高效

发现一款插件,可以高效的解决wordpress文章ID连续的问题,全代码如下(就一个文件)

<?php
/*
Plugin Name: 文章Id连续
Plugin URI: https://ds17.cn/26.html
Description: 确保新发布的文章具有连续的ID,而不会出现任何间隔。
Version: 1.0
Author: 大神博客
Author URI: https://ds17.cn/26.html
License: GPLv2 or later
*/

// 确保不会在其他操作中占用ID
add_action('admin_menu', 'continuous_post_ids_remove_hooks');
function continuous_post_ids_remove_hooks() {
    remove_action('wp_insert_post', 'wp_update_term_count');
    remove_action('wp_insert_post', 'wp_update_comment_count');
}

// 在发表新文章时确保ID连续且没有空ID
add_filter('wp_insert_post_data', 'continuous_post_ids_set_post_id', 10, 2);
function continuous_post_ids_set_post_id($data, $postarr) {
    if ($data['post_status'] == 'publish' && $data['post_type'] == 'post') {
        global $wpdb;
        $unused_post_id = continuous_post_ids_get_unused_id();
        if ($unused_post_id) {
            $data['ID'] = $unused_post_id;
        }
    }
    return $data;
}

// 查询未使用的ID
function continuous_post_ids_get_unused_id() {
    global $wpdb;
    $sql = "SELECT a.ID + 1 AS unused_id
            FROM $wpdb->posts a
            LEFT JOIN $wpdb->posts b ON a.ID + 1 = b.ID
            WHERE a.post_type = 'post' AND a.post_status = 'publish' AND b.ID IS NULL
            ORDER BY a.ID
            LIMIT 1";
    return $wpdb->get_var($sql);
}

解析一下

移除钩子

add_action('admin_menu', 'continuous_post_ids_remove_hooks');
function continuous_post_ids_remove_hooks() {
    remove_action('wp_insert_post', 'wp_update_term_count');
    remove_action('wp_insert_post', 'wp_update_comment_count');
}
  • 这个部分通过admin_menu钩子注册了一个函数,该函数在WordPress后台菜单加载时执行。
  • 它移除了wp_insert_post钩子上的wp_update_term_countwp_update_comment_count函数。这可能是为了避免在插入新文章时执行与文章ID连续性无关的操作,但这一步是否真的必要或有助于ID连续性是有疑问的,因为这两个函数主要负责更新术语和评论计数,与ID分配不直接相关。

过滤新文章数据

add_filter('wp_insert_post_data', 'continuous_post_ids_set_post_id', 10, 2);
function continuous_post_ids_set_post_id($data, $postarr) {
    if ($data['post_status'] == 'publish' && $data['post_type'] == 'post') {
        global $wpdb;
        $unused_post_id = continuous_post_ids_get_unused_id();
        if ($unused_post_id) {
            $data['ID'] = $unused_post_id;
        }
    }
    return $data;
}
  • 这部分通过wp_insert_post_data钩子注册了一个过滤器函数,该函数在文章数据被插入数据库之前执行。
  • 如果文章状态是“发布”且文章类型是“post”,则尝试查找一个未使用的ID并设置给新文章。
  • 这通过调用continuous_post_ids_get_unused_id函数实现。

查询未使用的ID

function continuous_post_ids_get_unused_id() {
    global $wpdb;
    $sql = "SELECT a.ID + 1 AS unused_id
            FROM $wpdb->posts a
            LEFT JOIN $wpdb->posts b ON a.ID + 1 = b.ID
            WHERE a.post_type = 'post' AND a.post_status = 'publish' AND b.ID IS NULL
            ORDER BY a.ID
            LIMIT 1";
    return $wpdb->get_var($sql);
}
  • 这个函数通过执行一个SQL查询来查找未使用的文章ID。
  • 它查找当前已发布的文章中,其ID+1不在任何已发布文章ID中的最小ID+1值。
  • 这意味着如果文章ID是连续的(例如1, 2, 3),并且ID 3之后没有文章,那么这个查询将返回4作为下一个未使用的ID。

总结

注意事项

  • 性能影响:每次发布新文章时执行这个查询可能会对性能产生影响,特别是当文章数量非常多时。
  • 数据完整性:直接操作文章ID可能会导致一些潜在的问题,特别是如果其他插件或主题依赖于文章ID的连续性或顺序。
  • 并发问题:如果有多个用户同时发布文章,可能会出现ID冲突的情况,尽管这种情况较为罕见。
  • 安全性:直接执行SQL查询需要谨慎,确保查询是安全的,不会受到SQL注入攻击。在这个例子中,由于查询是直接硬编码的,并且没有使用用户输入,因此看起来是安全的。

总的来说,这个插件的目的是一个有趣的实验,但在生产环境中使用之前,建议仔细考虑其潜在的影响和限制。

下载权限
查看
  • 免费下载
    评论并刷新后下载
    登录后下载
  • {{attr.name}}:
您当前的等级为
登录后免费下载登录 小黑屋反思中,不准下载! 评论后刷新页面下载评论 支付以后下载 请先登录 您今天的下载次数(次)用完了,请明天再来 支付积分以后下载立即支付 支付以后下载立即支付 您当前的用户组不允许下载升级会员
您已获得下载权限 您可以每天下载资源次,今日剩余
免责声明:
1.本站所有内容只做学习和交流使用。 版权归原作者所有。
2.保证站内提供的所有可下载源码资源(软件等)都是按“原样”提供,本站未做过任何改动;但本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。
3.本站部分内容均收集于网络!如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。请联系站长邮箱:admin#ibian.online(#换成@)处理!

给TA打赏
共{{data.count}}人
人已打赏
网站类

WordPress有哪些默认的api接口?

2025-2-19 10:50:15

网站类

Wordpress优化-动静分离

2025-2-20 11:26:15

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索