分类: 主题美化

此分类下的主题美化教程,大部分都以B2主题为基础美化,包括JS功能等。代码基本都是通用的,个别地方可能需要你自己修改,不会的可以在文章下方留言。

  • 文章内页下载按钮

    由于B2主题可能已经不再维护,同时B2主题的下载模块与文章内容分离,难以迁移主题

    所以我打算将所有下载模块的链接填入到我自定义的下载按钮中,如果需要积分获取/隐藏的,只需要用短代码包裹按钮即可

    这样一来,以后更换主题就不需要考虑如何将B2下载模块的链接一并提取出来了,只需要配合我整的下载按钮即可随意迁移站内文章

    图示

    文章内页下载按钮

    代码原理

    三种不同的按钮方式:

    • 链接按钮 – 用于在线工具等分享工具网站用的按钮
    • 软件按钮 – 用于分享软件、网盘链接等(自动识别天翼、123盘、百度盘分享链接)
    • 固定按钮 – 用于分享固定地址的静态html结构按钮,有利于B2主题的隐藏标签包裹

    填入地址自动解析链接地址,然后点击插入按钮,将按钮代码/短代码,插入到文章底部以生成访问按钮

    通过地址加密的方法,加密按钮地址,避免采集工具一键搬空网站

    源代码

    [content_hide]

    📦 资源下载
    🔐 提取码:
    5mwpm



    立即下载

    [/content_hide]

  • 自动清理下载模块并提取链接

    不得不说AI的强大,由于我网站有将近400篇下载模块的链接需要提取出来,然后配合我的下载按钮

    [b2_insert_post id=”1942″]

    本来感觉要折腾两三天才能整理完,突发奇想用AI做半自动的操作代码,没想到十几分钟就搞完了。。

    代码逻辑

    提取下载模块编辑框中的地址链接 → 将链接填入下载按钮设置中 → 自动点击下载按钮的插入按钮 → 关闭下载模块 → 删除下载模块的列表 → 点击更新文章

    好家伙一套小连招,一会就整完了,如果搭配自动点开编辑页面,和自动切换文章列表页,我可能什么都不用干了,不过我还是手动打开文章了,想着看一眼别有什么差错

    相关代码

    [content_hide]

     /**
     * B2主题下载模块链接自动迁移
     * 最终版:支持批量打开+自动更新保存+防重复执行
     */
    function b2_auto_migrate_download_link() {
        // 只在文章编辑页面执行
        global $pagenow, $post;
        if ($pagenow !== 'post.php' && $pagenow !== 'post-new.php') {
            return;
        }
        
        // 获取当前文章ID(用于标记执行状态)
        $post_id = isset($post->ID) ? $post->ID : 0;
        ?>
        <script type="text/javascript">
        jQuery(document).ready(function($) {
            // ========== 核心保护机制 ==========
            // 1. 检查当前文章是否已执行过迁移(通过localStorage标记)
            var postId = <?php echo $post_id; ?>;
            var executedKey = 'b2_download_migrate_' + postId;
            
            // 如果已执行过,直接退出
            if (localStorage.getItem(executedKey)) {
                console.log('文章ID ' + postId + ' 已执行过链接迁移,跳过');
                return;
            }
    
            // 2. 增加随机延迟(避免多个标签页同时执行)
            var randomDelay = 1500 + Math.floor(Math.random() * 2000); // 1.5-3.5秒随机延迟
            
            // 等待页面完全加载(确保所有元素都已渲染)
            setTimeout(function() {
                try {
                    // ========== 步骤1:检查是否有可迁移的资源(提前过滤) ==========
                    var downloadUrlTextarea = $('#b2_single_post_download_group_0_url');
                    var deleteBtn = $('.cmb-remove-group-row.dashicons-no-alt');
                    
                    // 如果没有资源链接或没有删除按钮,直接标记为已执行并退出
                    if (!downloadUrlTextarea.length || !deleteBtn.length) {
                        localStorage.setItem(executedKey, 'done');
                        console.log('文章ID ' + postId + ' 无迁移资源,标记为已处理');
                        return;
                    }
                    
                    // ========== 步骤2:提取下载设置中的第一条资源链接 ==========
                    var rawContent = downloadUrlTextarea.val().trim();
                    var extractedUrl = '';
                    
                    if (rawContent) {
                        // 按换行分割内容,只处理第一行
                        var lines = rawContent.split(/\r?\n/);
                        var firstLine = lines[0].trim(); // 只取第一行
                        
                        // 解析第一行内容中的链接
                        if (firstLine.indexOf('|') !== -1) {
                            var parts = firstLine.split('|');
                            // 遍历第一行的所有部分找URL
                            parts.forEach(function(part) {
                                if (part.match(/https?:\/\/[^\s]+/i) && !extractedUrl) {
                                    extractedUrl = part.trim();
                                }
                            });
                        } else {
                            // 直接匹配第一行中的URL
                            var urlMatch = firstLine.match(/https?:\/\/[^\s]+/i);
                            if (urlMatch) {
                                extractedUrl = urlMatch[0];
                            }
                        }
                    }
                    
                    if (!extractedUrl) {
                        localStorage.setItem(executedKey, 'no_url');
                        console.log('文章ID ' + postId + ' 未提取到有效链接,标记为已检查');
                        return;
                    }
                    console.log('文章ID ' + postId + ' 提取到的第一条链接:', extractedUrl);
    
                    // ========== 步骤3:选择Linkdown类型 ==========
                    var linkdownRadio = $('input[name="download_type"][value="linkdown"]');
                    if (linkdownRadio.length) {
                        linkdownRadio.prop('checked', true);
                        linkdownRadio.trigger('change');
                    }
    
                    // ========== 步骤4:填入Linkdown输入框 ==========
                    var linkdownInput = $('#linkdown_url');
                    if (linkdownInput.length) {
                        linkdownInput.val(extractedUrl);
                    }
    
                    // ========== 步骤5:点击插入访问按钮 ==========
                    var insertBtn = $('#insert-linkdown-btn');
                    if (insertBtn.length) {
                        insertBtn.trigger('click');
                        console.log('文章ID ' + postId + ' 已插入访问按钮短代码');
                    }
    
                    // ========== 步骤6:删除原下载设置中的资源项 ==========
                    if (deleteBtn.length) {
                        window.confirm = function() { return true; };
                        deleteBtn.trigger('click');
                        delete window.confirm;
                        console.log('文章ID ' + postId + ' 已删除原下载设置中的资源项');
                    }
    
                    // ========== 步骤7:自动更新保存文章(核心新增功能) ==========
                    // 生成2-4秒的随机延迟,避免批量更新服务器压力
                    var saveDelay = 2000 + Math.floor(Math.random() * 2000); 
                    setTimeout(function() {
                        // 找到更新按钮并点击
                        var updateBtn = $('#publish');
                        if (updateBtn.length && updateBtn.val() === '更新') {
                            console.log('文章ID ' + postId + ' 开始自动保存更新');
                            updateBtn.trigger('click');
                            
                            // 标记为已完成(包含更新)
                            localStorage.setItem(executedKey, 'updated');
                            console.log('文章ID ' + postId + ' 自动更新完成,标记为已处理');
                        } else {
                            // 兼容新建文章的"发布"按钮(可选)
                            if (updateBtn.length && updateBtn.val() === '发布') {
                                console.log('文章ID ' + postId + ' 是新建文章,跳过自动发布');
                                localStorage.setItem(executedKey, 'draft_skipped');
                            } else {
                                console.log('文章ID ' + postId + ' 未找到更新按钮');
                                localStorage.setItem(executedKey, 'no_update_btn');
                            }
                        }
                    }, saveDelay);
    
                } catch (e) {
                    console.error('文章ID ' + postId + ' 自动迁移下载链接出错:', e);
                    // 出错也标记为已检查,避免重复报错
                    localStorage.setItem(executedKey, 'error');
                }
            }, randomDelay); // 初始随机延迟,分散执行压力
        });
        </script>
        <?php
    }
    add_action('admin_footer', 'b2_auto_migrate_download_link');
    
    /**
     * 可选:添加后台清理标记的功能(在工具菜单显示)
     */
    function b2_clear_download_migrate_marks() {
        add_management_page(
            '清理下载迁移标记',
            '清理下载迁移标记',
            'manage_options',
            'b2-clear-migrate-marks',
            function() {
                ?>
                <div class="wrap">
                    <h1>清理下载迁移标记</h1>
                    <p>点击下方按钮可清理浏览器中记录的文章迁移标记,让所有文章重新执行迁移逻辑。</p>
                    <button id="clear-marks-btn" class="button button-primary">清理所有标记</button>
                    <p id="clear-result" style="margin-top: 10px; color: green; display: none;">标记已清理完成!</p>
                </div>
                <script>
                jQuery('#clear-marks-btn').click(function() {
                    // 遍历localStorage删除所有迁移标记
                    for (var i = 0; i < localStorage.length; i++) {
                        var key = localStorage.key(i);
                        if (key.indexOf('b2_download_migrate_') === 0) {
                            localStorage.removeItem(key);
                        }
                    }
                    jQuery('#clear-result').show();
                    setTimeout(function() {
                        jQuery('#clear-result').hide();
                    }, 3000);
                });
                </script>
                <?php
            }
        );
    }
    add_action('admin_menu', 'b2_clear_download_migrate_marks');

     

    [/content_hide]

  • 新文章使用上次文章所选的标签

    代码介绍

    平时大量发布文章时,总有一个非常麻烦的问题,就是标签的重复选择。通常在大批量手动发布文章的时候,都是同分类,同标签的状态进行发布的。

    之前分享了写新文章时,自动勾选上次已选择的分类,文章如下:

    [b2_insert_post id=”95″]

    那么本次就分享自动添加上次文章添加的标签

    [content_hide]

    /**
     * 1. 记忆功能:当文章保存或发布时,记录当前使用的标签
     */
    function smart_tags_save_last_used($post_id) {
        // 如果是自动保存、修订版本或没有权限,则跳过
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
        if (wp_is_post_revision($post_id)) return;
        
        // 获取当前文章的标签(只获取名称)
        $tags = wp_get_post_tags($post_id, array('fields' => 'names'));
        
        // 如果有标签,则保存到当前用户的个人元数据中
        // 使用逗号连接,方便后续 JS 直接使用
        if (!empty($tags)) {
            update_user_meta(get_current_user_id(), 'last_used_post_tags', implode(',', $tags));
        }
    }
    add_action('save_post', 'smart_tags_save_last_used');
    
    /**
     * 2. 自动添加功能:在后台编辑器加载时,通过 JS 自动填充
     */
    function smart_tags_auto_fill_script() {
        // 仅在文章编辑页面或新建文章页面加载
        $screen = get_current_screen();
        if (!$screen || 'post' !== $screen->base || 'post' !== $screen->post_type) {
            return;
        }
    
        // 获取当前用户最后一次使用的标签
        $last_tags = get_user_meta(get_current_user_id(), 'last_used_post_tags', true);
        
        // 如果没有历史标签,直接返回
        if (empty($last_tags)) return;
        
        ?>
        <script type="text/javascript">
        jQuery(document).ready(function($) {
            // 定义检查和执行函数
            function tryAddSmartTags() {
                // 目标容器:标签列表
                var $checklist = $('#post_tag .tagchecklist');
                // 目标输入框
                var $input = $('#new-tag-post_tag');
                // 目标按钮
                var $btn = $('#post_tag .tagadd');
    
                // 确保这些元素都存在
                if ($checklist.length && $input.length && $btn.length) {
                    
                    // 逻辑判断:检查标签列表是否为空
                    // 只有当列表里没有标签时(即 children 数量为 0),才自动添加
                    if ($checklist.children().length === 0) {
                        
                        // 将保存的标签填入输入框
                        $input.val('<?php echo esc_js($last_tags); ?>');
                        
                        // 模拟点击“添加”按钮
                        $btn.click();
                        
                        console.log('历史标签已自动添加');
                    } else {
                        console.log('当前文章已有标签,跳过自动添加');
                    }
                }
            }
    
            // 稍微延迟执行,确保 WP 的原有 JS 已加载完毕
            setTimeout(tryAddSmartTags, 500);
        });
        </script>
        <?php
    }
    add_action('admin_footer', 'smart_tags_auto_fill_script');

    [/content_hide]

     

  • 批量修改文章下载权限

    此代码仅可以对文章ID范围进行修改,例如文章id:1-100 的范围,无法对指定分类进行修改。其实比较鸡肋,但对于一段时间一直写同一种类型文章的批量权限有点帮助。

    但这是春哥给别人写的,我觉得比较保险。

    我尝试了将此代码修改为分类下的文章修改,放在文章末尾

    使用方法:

    • 设置好你要修改的文章id范围,然后设置你要修改的权限,只能单独一个权限
    • 将此代码放到子主题,page目录下创建一个php文件将代码放进去,打开浏览器访问这个php文件即可。
    • 访问地址示例:www.xxxx.cn/wp-content/themes/b2child/Pages/aaa.php
    <?php
    /**
     * 使用此代码前,先备份一下数据库,以免出现意外造成数据损坏。
     * 此代码复制到 Pages/test.php 中保存,然后使用 你的网址+/test 去访问一下,显示成功后再删掉保存即可。
     */
    
    // 加载WordPress核心环境(关键修复)
    // 请确认 ABSPATH 的路径是否正确,以下是标准路径,若你的网站目录结构不同需调整
    define('WP_USE_THEMES', false);
    require_once('../../../../wp-load.php');
    
    // 防止非管理员访问(可选,增加安全性)
    if (!current_user_can('administrator')) {
        wp_die('你没有权限访问此页面!');
    }
    
    // 原始业务逻辑
    $arg = array(
        'post_type'=>'post',//文章形式是post
        'post_status'=>'publish',//文章状态是已发布
        'posts_per_page'=>-1//所有文章,如果文章数量过多(几万篇),可能速度很慢
    );
    
    $the_query = new WP_Query($arg);
    if ( $the_query->have_posts() ) {
        while ( $the_query->have_posts() ) {
            $the_query->the_post();
            $id = get_the_id();
            $res = false;
    
            //要设置的文章ID范围
            if($id >=1184 && $id <= 1349){
    
                $downs = get_post_meta($id,'b2_single_post_download_group',true);
                if(!empty($downs)){
    
                    $save = false;
    
                    foreach ($downs as $k => $v) {
                        if(isset($downs[$k]['rights'])){
                            $downs[$k]['rights'] = 'all|free';
                            $save = true;
                        }
                    }unset($v);
    
                    if($save){
                        update_post_meta($id,'b2_single_post_download_group',$downs);
                    }
    
                }
            }
        }
        echo '完成';
        wp_reset_postdata();
    } else {
        echo '没有文章';
    }
    
    // 结束执行
    exit;
    ?>

    通过分类ID批量修改指定分类下的文章下载权限|使用方法同上

    在你拿走这个功能时,我想告诉你一点我的想法:
    1、在你用此代码之前,我希望你一定要备份好自己的网站数据库后,再进行修改
    2、我希望熬的这3个小时成果有帮到你,如果你用了有问题可以好好交流,不要恶言相向。
    3、代码我测试了没问题,但我无法对你的数据进行保障,如果你没有任何代码基础,也对我并不放心,希望你停止使用

    [content_hide]

    <?php
    /**
     * WordPress 自定义字段批量修改工具(光标行精准修改版)
     * 核心:按钮修改光标所在行内容,而非最后一行
     */
    
    // 加载WordPress核心环境
    define('WP_USE_THEMES', false);
    require_once('../../../../wp-load.php');
    
    // 1. 管理员权限验证
    if (!current_user_can('administrator')) {
        wp_die('你没有权限访问此页面!仅管理员可操作。');
    }
    
    // 2. 处理表单提交逻辑
    $submit_result = '';
    if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['batch_modify_submit'])) {
        // CSRF安全验证
        if (!wp_verify_nonce($_POST['batch_modify_nonce'], 'batch_modify_action')) {
            $submit_result = '<div class="alert error">⚠️ 安全验证失败!请刷新页面重试。</div>';
        } else {
            // 接收并过滤输入
            $target_category_id = intval($_POST['category_id']);
            $rights_text = sanitize_textarea_field($_POST['rights_value']);
            
            // 基础验证
            if ($target_category_id <= 0) {
                $submit_result = '<div class="alert error">⚠️ 分类ID必须是大于0的数字!</div>';
            } elseif (empty(trim($rights_text))) {
                $submit_result = '<div class="alert error">⚠️ 权限值不能为空!</div>';
            } else {
                // 处理多行文本为带\r\n的字符串(匹配数据库格式)
                $rights_lines = preg_split('/\r\n|\r|\n/', $rights_text);
                $valid_lines = [];
                foreach ($rights_lines as $line) {
                    $line = trim($line);
                    if (!empty($line)) {
                        $valid_lines[] = $line;
                    }
                }
                $target_rights = implode("\r\n", $valid_lines);
                
                // 执行批量修改
                $arg = array(
                    'post_type'      => 'post',
                    'post_status'    => 'publish',
                    'posts_per_page' => -1,
                    'no_found_rows'  => true,
                    'cat'            => $target_category_id,
                    'fields'         => 'ids',
                );
                
                $post_ids = get_posts($arg);
                $total_posts = count($post_ids);
                $has_field_posts = 0;
                $updated_posts = 0;
                $log = [];
                
                if ($total_posts > 0) {
                    foreach ($post_ids as $post_id) {
                        $downs = get_post_meta($post_id, 'b2_single_post_download_group', true);
                        $log[] = "文章ID {$post_id}:";
                        
                        if (empty($downs)) {
                            $log[] = "  → 无b2_single_post_download_group字段 → 跳过";
                            continue;
                        }
                        
                        $has_field_posts++;
                        $save = false;
                        foreach ($downs as $k => $v) {
                            if (isset($downs[$k]['rights'])) {
                                $old_value = $downs[$k]['rights'];
                                $downs[$k]['rights'] = $target_rights;
                                $save = true;
                                // 日志优化:换行符转为可视化的「↵」
                                $log_old = str_replace("\r\n", " ↵ ", $old_value);
                                $log_new = str_replace("\r\n", " ↵ ", $target_rights);
                                $log[] = "  → 原rights值:{$log_old}";
                                $log[] = "  → 新rights值:{$log_new}";
                            }
                        }
                        
                        if ($save) {
                            update_post_meta($post_id, 'b2_single_post_download_group', $downs);
                            $updated_posts++;
                            $log[] = "  → 保存成功";
                        } else {
                            $log[] = "  → 无rights字段 → 跳过";
                        }
                    }
                    
                    // 结果展示
                    $show_rights = str_replace("\r\n", " ↵ ", $target_rights);
                    $submit_result = '
                    <div class="alert success">✅ 执行完成!
                        <ul>
                            <li>目标分类ID:'.$target_category_id.'</li>
                            <li>目标权限值(共'.count($valid_lines).'行):'.$show_rights.'</li>
                            <li>分类下已发布文章总数:'.$total_posts.'</li>
                            <li>包含目标字段的文章数:'.$has_field_posts.'</li>
                            <li>成功修改的文章数:'.$updated_posts.'</li>
                        </ul>
                        <div class="log">
                            <strong>详细日志(↵代表换行):</strong><br>
                            '.implode('<br>', $log).'
                        </div>
                    </div>';
                } else {
                    $submit_result = '<div class="alert warning">⚠️ 分类ID '.$target_category_id.' 下没有找到已发布的文章!</div>';
                }
            }
        }
    }
    
    // 3. 前台表单界面(光标行精准修改)
    ?>
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>B2主题文章下载权限批量修改工具</title>
        <style>
            body { font-family: Arial, sans-serif; max-width: 800px; margin: 50px auto; padding: 0 20px; line-height: 1.6; }
            .form-container { background: #f5f5f5; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
            .form-group { margin-bottom: 20px; }
            label { display: block; margin-bottom: 8px; font-weight: bold; color: #333; }
            input[type="number"] { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 16px; }
            textarea { width: 100%; padding: 10px; border: 1px solid #ddd; border-radius: 4px; font-size: 16px; min-height: 150px; resize: vertical; }
            button { cursor: pointer; border: none; border-radius: 4px; font-size: 14px; padding: 8px 16px; margin: 0 5px 8px 0; }
            .submit-btn { background: #21759b; color: white; padding: 12px 30px; font-size: 16px; margin-top: 10px; }
            .submit-btn:hover { background: #135e87; }
            .prefix-btn { background: #4285f4; color: white; }
            .prefix-btn:hover { background: #3367d6; }
            .suffix-btn { background: #0f9d58; color: white; }
            .suffix-btn:hover { background: #0b8043; }
            .clear-btn { background: #db4437; color: white; }
            .clear-btn:hover { background: #c53929; }
            .btn-group { margin: 10px 0; }
            .btn-group label { display: inline-block; margin-right: 10px; font-weight: normal; color: #666; }
            .alert { padding: 15px; border-radius: 4px; margin-top: 20px; }
            .success { background: #d4edda; color: #155724; }
            .error { background: #f8d7da; color: #721c24; }
            .warning { background: #fff3cd; color: #856404; }
            .log { margin-top: 10px; padding: 10px; background: #fff; border-radius: 4px; font-size: 14px; }
            .hint { font-size: 14px; color: #666; margin-top: 5px; }
        </style>
    </head>
    <body>
        <div class="form-container">
            <h2>B2主题文章下载权限批量修改工具</h2>
            <p>说明:修改前备份数据库!不仅要服务器备份,拖到你电脑本地一份!避免修改数据酿成大错!</p>
            <p>我一直认为改数据是很重要的事情,如果有免费的快照,大改之前去服务商那里备份一个服务器快照!</p>
            <form method="post" action="">
                <?php wp_nonce_field('batch_modify_action', 'batch_modify_nonce'); ?>
                
                <!-- 分类ID输入 -->
                <div class="form-group">
                    <label for="category_id">目标分类ID(必填)分类目录id去你的文章分类目录查看,第一排的数字ID就是</label>
                    <input type="number" id="category_id" name="category_id" min="1" placeholder="例如:5" required>
                </div>
                
                <!-- 权限值输入 + 快捷按钮 -->
                <div class="form-group">
                    <label for="rights_value">文章权限值(必填,一行一个)写完回车换行</label>
                    <textarea id="rights_value" name="rights_value" placeholder="例如:
    all|free
    lv1|credit=1
    vip0|free" required><?php echo isset($_POST['rights_value']) ? esc_textarea($_POST['rights_value']) : "all|free
    lv|credit=1
    vip0|free"; ?></textarea>
                    
                    <!-- 前缀按钮组 -->
                    <div class="btn-group">
                        <label>前缀(用户类型):</label>
                        <button type="button" class="prefix-btn" data-value="all|">所有</button>
                        <button type="button" class="prefix-btn" data-value="lv|">普通用户</button>
                        <button type="button" class="prefix-btn" data-value="vip|">VIP</button>
                        <button type="button" class="prefix-btn" data-value="guest|">游客</button>
                    </div>
                    
                    <!-- 后缀按钮组 -->
                    <div class="btn-group">
                        <label>后缀(权限类型):</label>
                        <button type="button" class="suffix-btn" data-value="comment">评论可见</button>
                        <button type="button" class="suffix-btn" data-value="login">登录可见</button>
                        <button type="button" class="suffix-btn" data-value="credit=">积分(需补数值)</button>
                        <button type="button" class="suffix-btn" data-value="money=">付费(需补数值)</button>
                        <button type="button" class="suffix-btn" data-value="free">免费</button>
                    </div>
                    
                    <!-- 辅助按钮 -->
                    <div class="btn-group">
                        <button type="button" class="clear-btn" id="clearText">清空文本框</button>
                        <div class="hint">提示:1. 按钮修改光标所在行内容;2. 积分/付费后缀需手动补充数值(如credit=10);3. 自动过滤空行</div>
                    </div>
                </div>
                
                <!-- 提交按钮 -->
                <button type="submit" name="batch_modify_submit" class="submit-btn">提交修改</button>
            </form>
            
            <!-- 提交结果展示 -->
            <?php if ($submit_result) echo $submit_result; ?>
        </div>
    
        <script>
            // 核心逻辑:精准修改光标所在行内容
            document.addEventListener('DOMContentLoaded', function() {
                const textarea = document.getElementById('rights_value');
                
                // 1. 前缀按钮点击事件(修改光标行前缀)
                document.querySelectorAll('.prefix-btn').forEach(btn => {
                    btn.addEventListener('click', function() {
                        const prefix = this.dataset.value;
                        updateCurrentLine('prefix', prefix);
                    });
                });
                
                // 2. 后缀按钮点击事件(修改光标行后缀)
                document.querySelectorAll('.suffix-btn').forEach(btn => {
                    btn.addEventListener('click', function() {
                        const suffix = this.dataset.value;
                        updateCurrentLine('suffix', suffix);
                    });
                });
                
                // 3. 清空文本框按钮
                document.getElementById('clearText').addEventListener('click', function() {
                    textarea.value = '';
                    textarea.focus();
                });
                
                // 核心函数1:获取光标所在行的信息
                function getCursorLineInfo() {
                    const cursorPos = textarea.selectionStart;
                    const content = textarea.value;
                    // 分割所有行(兼容\r\n、\r、\n)
                    const lines = content.split(/\r\n|\r|\n/);
                    
                    // 计算光标所在行号和该行内容
                    let currentLineIndex = 0;
                    let charCount = 0;
                    for (let i = 0; i < lines.length; i++) {
                        // 每行的字符数 + 换行符长度(\n是1,\r\n是2)
                        const lineLength = lines[i].length + (content.includes('\r\n') ? 2 : 1);
                        if (charCount + lineLength > cursorPos) {
                            currentLineIndex = i;
                            break;
                        }
                        charCount += lineLength;
                    }
                    
                    return {
                        lineIndex: currentLineIndex, // 光标所在行索引
                        lineContent: lines[currentLineIndex] || '', // 光标行内容
                        allLines: lines // 所有行数组
                    };
                }
                
                // 核心函数2:更新光标所在行内容
                function updateCurrentLine(type, value) {
                    const { lineIndex, lineContent, allLines } = getCursorLineInfo();
                    let newLineContent = lineContent.trim();
                    
                    // 处理前缀/后缀替换
                    if (type === 'prefix') {
                        // 替换前缀:分割|,保留后缀,替换前缀
                        const parts = newLineContent.split('|');
                        if (parts.length > 1) {
                            newLineContent = value + parts[1]; // 保留原有后缀
                        } else {
                            newLineContent = value; // 无后缀则仅添加前缀
                        }
                    } else if (type === 'suffix') {
                        // 替换后缀:分割|,保留前缀,替换后缀
                        const parts = newLineContent.split('|');
                        if (parts.length > 0 && parts[0]) {
                            newLineContent = parts[0] + '|' + value; // 保留原有前缀
                        } else {
                            newLineContent = 'all|' + value; // 无前缀则默认all|
                        }
                    }
                    
                    // 更新光标行内容
                    allLines[lineIndex] = newLineContent;
                    // 重新拼接所有行(用\n兼容所有编辑器,提交时会自动转为\r\n)
                    textarea.value = allLines.join('\n');
                    
                    // 恢复光标位置到该行末尾
                    // 计算新光标位置
                    let newCursorPos = 0;
                    for (let i = 0; i < lineIndex; i++) {
                        newCursorPos += allLines[i].length + 1; // +1是\n的长度
                    }
                    newCursorPos += newLineContent.length;
                    
                    // 聚焦并定位光标
                    textarea.focus();
                    textarea.selectionStart = textarea.selectionEnd = newCursorPos;
                    // 滚动到光标位置
                    textarea.scrollTop = textarea.scrollHeight;
                }
            });
        </script>
    </body>
    </html>

     
    [/content_hide]

  • 新建文章自动勾选下载模块选项

    新建资源下载文章,每次都要复设置开启下载 / 游客权限、选择预设模板,大量整理文章时,每次都要重新选择就会很头大,于是整了个自动选择的代码

    1、代码不懂可以让ai解释给你

    2、代码直接放到functions.php中刷新页面即可使用

    3、代码为前端操作DOM,不操作数据库,也不与数据库进行交互,放心使用

    代码解释:

    1、当【是否开启下载功能】为 0 (关闭)时,自动修改为 1 (开启),反之不做任何修改

    2、当【是否允许游客购买】为 0 (禁止)时,自动修改为 1 (允许),反之不做任何修改

    3、当【选择模版】为 0 (不选择)时,自动修改为 1 (下载模板1),反之不做任何修改。(预设的下载模板如果有多个,在控制台查看模板序号,如图)

    新建文章自动勾选下载模块选项

    如果你不需要某个自动选择功能,也不会代码,可以用ai帮你删掉或禁止。

    都有详细的注释,你也可以通过这个功能,填充更多的默认信息到下载模块的文本框,将文本框id交给AI帮你改即可。

    [content_hide]

    /**
     * 后台自动修正下载相关下拉框默认值
     * 执行顺序:
     * 1. 下载功能开关(b2_open_download):关闭 → 开启
     * 2. 游客购买权限(b2_down_guest_buy):禁止 → 允许
     * 3. 下载模板选择(b2_single_post_download_group_0_template):不选择 → 下载模板1
     */
    function b2_auto_select_download_option() {
        // 安全校验:仅在WordPress后台执行,避免影响前端页面
        if (!is_admin()) {
            return;
        }
    
        // 内联JS脚本(原生JS,无依赖,避免冲突)
        $js_code = <<<JS
    // 等待DOM完全加载后执行(确保能找到所有下拉框元素)
    document.addEventListener('DOMContentLoaded', function() {
        /**************************
         * 第1步:处理「下载功能开关」下拉框
         * 元素ID:b2_open_download(可修改)
         * 逻辑:当前值为0(关闭)→ 改为1(开启);已为1则不操作
         **************************/
        // 1.1 定位下拉框(通过ID精准匹配,修改ID需同步改这里)
        const downloadSwitch = document.getElementById('b2_open_download');
        if (downloadSwitch) {
            // 1.2 判断当前值(0=关闭,1=开启,可根据实际值修改)
            if (downloadSwitch.value === '0') {
                downloadSwitch.value = '1'; // 改为「开启」
                // 触发change事件(确保联动逻辑生效,比如显示/隐藏相关配置,可选保留)
                downloadSwitch.dispatchEvent(new Event('change'));
            }
        }
    
        /**************************
         * 第2步:处理「游客购买权限」下拉框
         * 元素ID:b2_down_guest_buy(可修改)
         * 逻辑:当前值为0(禁止)→ 改为1(允许);已为1则不操作
         **************************/
        // 2.1 定位下拉框(修改ID需同步改这里)
        const guestBuyPerm = document.getElementById('b2_down_guest_buy');
        if (guestBuyPerm) {
            // 2.2 判断当前值(0=禁止,1=允许,可根据实际值修改)
            if (guestBuyPerm.value === '0') {
                guestBuyPerm.value = '1'; // 改为「允许」
                guestBuyPerm.dispatchEvent(new Event('change')); // 触发联动事件
            }
        }
    
        /**************************
         * 第3步:处理「下载模板选择」下拉框
         * 元素ID:b2_single_post_download_group_0_template(可修改)
         * 逻辑:当前值为0(不选择)→ 改为1(下载模板1);已为1则不操作
         **************************/
        // 3.1 定位下拉框(修改ID需同步改这里)
        const downloadTemplate = document.getElementById('b2_single_post_download_group_0_template');
        if (downloadTemplate) {
            // 3.2 判断当前值(0=不选择,1=下载模板1,可根据实际值修改)
            if (downloadTemplate.value === '0') {
                downloadTemplate.value = '1'; // 改为「下载模板1」
                downloadTemplate.dispatchEvent(new Event('change')); // 触发联动事件
            }
        }
    });
    JS;
    
        // 将JS脚本添加到后台页面底部(依赖jquery-core确保加载时机,无需修改)
        wp_add_inline_script('jquery-core', $js_code);
    }
    // 挂载到WordPress后台脚本加载钩子(无需修改)
    add_action('admin_enqueue_scripts', 'b2_auto_select_download_option');

    仅需要关闭下载模块的【是否开启下载功能】,如果监测到下载模块为开启,改为关闭(主要为了配合)以下文章

    [b2_insert_post id=”1940″]

    相关代码

    /**
     * 后台自动关闭下载功能开关
     * 核心逻辑:检测到下载功能开关(b2_open_download)为开启(值=1)→ 自动改为关闭(值=0)
     */
    function b2_auto_close_download_switch() {
        // 安全校验:仅在WordPress后台执行,避免影响前端页面
        if (!is_admin()) {
            return;
        }
    
        // 内联JS脚本(原生JS,无依赖,避免冲突)
        $js_code = <<<JS
    document.addEventListener('DOMContentLoaded', function() {
        /**************************
         * 处理「下载功能开关」下拉框
         * 元素ID:b2_open_download(请核对后台实际ID)
         * 逻辑:当前值为1(开启)→ 改为0(关闭);已为0则不操作
         **************************/
        // 1. 定位下拉框(通过ID精准匹配)
        const downloadSwitch = document.getElementById('b2_open_download');
        if (downloadSwitch) {
            // 2. 判断当前值:1=开启,0=关闭(请核对后台实际值)
            if (downloadSwitch.value === '1') {
                downloadSwitch.value = '0'; // 改为「关闭」
                // 触发change事件(确保后台联动逻辑生效,比如隐藏下载相关配置)
                downloadSwitch.dispatchEvent(new Event('change', { bubbles: true }));
                console.log('下载功能开关已自动关闭(原值为开启)'); // 调试用,可删除
            } else {
                console.log('下载功能开关已是关闭状态,无需操作'); // 调试用,可删除
            }
        } else {
            console.log('未找到下载功能开关下拉框(ID:b2_open_download),请核对ID'); // 调试用,可删除
        }
    });
    JS;
    
        // 将JS脚本添加到后台页面(挂载到jquery-core确保加载时机,原生JS无依赖)
        wp_add_inline_script('jquery-core', $js_code);
    }
    // 挂载到WordPress后台脚本加载钩子
    add_action('admin_enqueue_scripts', 'b2_auto_close_download_switch');

    [/content_hide]

  • 自动内容解析插件

    自动内容解析插件

    站长自用 – 不对外分享

    用来解析专属格式的json文章数据插件,将文章数据填写到对应文本框中

    [content_hide]深度理解上方指定的网址页面,了解指定页面的作用和功能
    访问并了解指定页面中的内容,理解指定网址页面的详细介绍,根据指定网址的主要内容来生成标题和正文
    围绕上方指定网站 / 工具撰写,风格口语化、适合网页阅读,逻辑连贯、生动易懂;
    完整保留核心信息,包含网站简介,网站的功能介绍 + 使用方法,段落结构优化(单段不超过 3 行),杜绝书面化生硬表达;

    文章结构必须包含:
    -标题、正文:需根据指定网址页面title,以及页面中的seo信息和页面的主要内容来生成对应的标题和正文,不要脱离指定网址的主要页面内容。
    -标题:含核心关键词,≤12 字,标题无需代码标签
    -生成文章标题,严格遵循以下格式和要求:
    1. 标题结构:【产品名称/核心功能】+【核心属性/场景】+「-」+【核心优势(1个关键词)】
    2. 元素要求:
    – 前半段:包含产品名称(如PrivyDrop)或核心功能(如隐私分享、临时传输);
    – 连接符:必须用「-」(英文半角破折号)分隔前后两部分;
    – 后半段:包含1个核心优势关键词,明确产品品类(如临时文件传输工具、在线剪贴板、私密共享平台);
    3. 风格约束:简洁直白、突出工具属性,不添加多余修饰词,字数控制在15-25字;
    4. 参考范例:PrivyDrop – 临时文件传输工具、PrivyDrop快传 – 大文件传输平台;
    5. 输出要求:每次生成标题时,严格匹配上述结构,不偏离范例风格。
    -正文:网站简介 → 使用方法或说明
    -正文:网站简介开始不要使用疑问,直接说明指定网站的简介即可,例如:xxx是一款xxx
    -正文:正文风格需口语化,适合网页阅读
    -正文主体需带代码标签:须段落清晰,结构美观。大段落标题使用

    标签,段落内容使用

    标签,小段落标题使用

    标签。禁止使用/n换行
    额外生成:
    -1 个 SEO 标题(贴合关键词)
    -3 个高相关性中文关键词(用英文逗号分隔,无重复 / 无关词汇)
    -1 条 SEO 描述(120-160 字符,含 1-2 个核心关键词,清晰概括文章核心价值)
    关键词分布规则:标题含 1 个核心关键词,正文首段、中间段落、结尾各至少出现 1 次核心关键词,关键词密度控制在 2%-3%(禁止堆砌);

    最终输出顺序:标题→ 正文 → seo标题 → seo关键词 → seo描述 → 指定的网址

    最终输出的json格式为:{
    “标题”:””,
    “正文”:””,
    “seo标题”:””,
    “seo关键词”:””,
    “seo描述”:””,
    “网址”:””
    }

    输出内容要求:
    -以json格式输出生成的内容,让我可以一键复制生成的内容
    -禁止在标题和正文中出现网址,仅保留网站的中文名称或英文名称即可[/content_hide]

  • 彩色标签滚动云小工具

    彩色标签滚动云小工具

    插件介绍

    热门标签展示:自动显示网站最常用的标签

    无限滚动效果:多行标签无缝循环滚动

    自定义设置

    • 标签数量:可设置显示1-100个热门标签
    • 布局控制:自定义每行显示1-20个标签
    • 滚动速度:5档速度调节(非常慢到非常快)

    插件选项:

    是否显示标签对应的文章数量

    是否在移动端隐藏小工具

    彩色标签滚动云小工具

    使用方法

    1. 将文件上传到/wp-content/plugins/ 文件夹下
    2. 在wordpress后台 – 插件 – 已安装插件 – 启用 All Tags Widget
    3. 在外观 – 小工具 – b2 – 彩色热门标签   【拖拽至你想要放置的位置】
    4. 刷新前端页面就可以看到效果

     
    [content_hide]

    📦 资源下载
    🔐 提取码:
    ZW3VS



    立即下载

    [/content_hide]

  • 文章内页点赞特效

    文章内页点赞特效

    简单介绍

    一个点赞后的动态效果,只有点赞后的动态效果,没有做取消点赞的效果,感觉没有必要,很少有人会取消点赞吧。

    点击后有一段小音效,可以自行替换

    使用方法看教程


    [content_hide]

    📦 资源下载
    🔐 提取码:
    UcGzn



    立即下载

    [/content_hide]

  • 首页四格按钮

    首页四格按钮

    具体效果自行在首页查看

    5个按钮,各自链接不同的地址,实现一个比较好看的样式,可以自行替换为自己喜欢的背景图片和功能,主要分享的是样式,具体看视频介绍

    视频介绍

    [content_hide]

    📦 资源下载
    🔐 提取码:
    a0aDD



    立即下载

    [/content_hide]

  • 首页大图搜索模块

    首页大图搜索模块

    简单介绍

    这是一个首页大图视频模块,主要是很多人在弄,我也跟风弄了一个

    功能详情:

    • 搜索功能:搜索后跳转到搜索结果页面
    • 热门标签:获取浏览量最多的5个标签 – 多彩颜色
    • 视频缓存:可播放多个视频,单用户7天内只能看到一个视频,7天后切换到下一个
    • 具体看下方视频介绍

     

    使用大图搜索模块


     

    后续顶部优化


     
    [content_hide]

    📦 资源下载
    🔐 提取码:
    2nkaN



    立即下载

    [/content_hide]