文章编辑后台为某个块设置仅管理员可见

分类 Logo

WordPress文章后台编辑页面,选中一个块时,右侧出现设置仅管理员可见的选项

完整步骤:

首先创建编辑器专用的JS文件:editor-custom.js

// editor-custom.js
wp.domReady(() => {
    // 获取所有块类型
    const blockTypes = wp.blocks.getBlockTypes();

    blockTypes.forEach(blockType => {
        // 扩展现有的块属性
        wp.blocks.unregisterBlockType(blockType.name);

        const settings = {
            ...blockType,
            attributes: {
                ...blockType.attributes,
                adminOnly: {
                    type: 'boolean',
                    default: false,
                }
            },
            edit: function(props) {
                const { attributes, setAttributes } = props;

                // 创建原始的编辑界面
                const originalEdit = blockType.edit;

                return wp.element.createElement(
                    wp.element.Fragment,
                    null,
                    originalEdit(props),
                    wp.element.createElement(
                        wp.blockEditor.InspectorControls,
                        {},
                        wp.element.createElement(
                            wp.components.PanelBody,
                            { title: '访问控制' },
                            wp.element.createElement(
                                wp.components.ToggleControl,
                                {
                                    label: '仅管理员可见',
                                    checked: attributes.adminOnly,
                                    onChange: (value) => setAttributes({ adminOnly: value })
                                }
                            )
                        )
                    )
                );
            }
        };

        wp.blocks.registerBlockType(blockType.name, settings);
    });
});

functions.php中加载编辑器脚本、处理前端显示逻辑:

// 加载编辑器脚本
add_action('enqueue_block_editor_assets', 'my_editor_scripts');
function my_editor_scripts() {
    wp_enqueue_script(
        'my-editor-custom-js', 
        get_stylesheet_directory_uri() . '/editor-custom.js', 
        array('wp-blocks', 'wp-element', 'wp-editor', 'wp-components'), 
        '1.0', 
        true
    );
}

// 处理前端显示逻辑
add_filter('render_block', 'filter_admin_only_blocks', 10, 2);
function filter_admin_only_blocks($block_content, $block) {
    // 如果块没有设置adminOnly属性,直接返回原内容
    if (empty($block['attrs']) || !isset($block['attrs']['adminOnly'])) {
        return $block_content;
    }

    // 只有设置了adminOnly时才检查权限
    if ($block['attrs']['adminOnly'] && !current_user_can('manage_options')) {
        return '';
    }

    return $block_content;
}

这个方案的特点:
1. 为所有块类型都添加了管理员可见选项
2. 在块的右侧面板中显示控制开关
3. 前端会自动过滤非管理员的访问
4. 代码组织清晰,维护方便

使用方法:
1. 在编辑器中选择任意块
2. 在右侧面板中找到”访问控制”选项
3. 打开”仅管理员可见”开关即可

这样就完成了所需功能的实现!


前端显示逻辑代码解释

这个过滤器的工作方式是这样的:

  1. WordPress在渲染页面时,会逐个处理每个块
  2. 对每个块,WordPress都会触发一次render_block过滤器
  3. 我们的函数会被调用,但只处理当前块,不是循环

页面内容:
[块1] -> 没有adminOnly属性 -> 直接返回原内容
[块2] -> 有adminOnly=true -> 检查权限
[块3] -> 没有adminOnly属性 -> 直接返回原内容

当普通访客访问时,该块不会输出到客户端浏览器:

  1. 服务器端处理:
if ($block['attrs']['adminOnly'] && !current_user_can('manage_options')) {
    return ''; // 返回空字符串
}

这里直接返回空字符串,意味着:
– 这个块的HTML完全不会输出到页面源代码中
– 访客的浏览器不会收到任何相关的HTML代码
– 不会留下任何痕迹(注释等)

举个例子,假设页面有3个段落块:

<!-- 管理员看到的 -->
<p>第一段(公开)</p>
<p>第二段(仅管理员)</p>
<p>第三段(公开)</p>

<!-- 访客看到的 -->
<p>第一段(公开)</p>
<p>第三段(公开)</p>

这样做的好处是:
1. 更安全 – 敏感内容完全不会传输到客户端
2. 更轻量 – 减少了页面大小
3. 无痕迹 – 查看源码也看不到任何相关信息

创建个“仅管理员可见”的区块

啊,这是个非常聪明的解决方案!确实更简单高效。让我们创建一个”管理员可见”区块:

// admin-only-block.js
wp.blocks.registerBlockType('csrwiki/admin-only', {
    title: '仅管理员可见',
    icon: 'lock',
    category: 'common',
    description: '此区块中的内容仅管理员可见',

    edit: function(props) {
        return wp.element.createElement(
            'div',
            { className: 'wp-block-csrwiki-admin-only' },
            [
                wp.element.createElement(
                    'div',
                    { className: 'admin-only-header' },
                    '🔒 仅管理员可见'
                ),
                wp.element.createElement(
                    'div',
                    { className: 'admin-only-content' },
                    wp.element.createElement(
                        wp.blockEditor.InnerBlocks,
                        {
                            template: [
                                ['core/paragraph', {}]
                            ],
                            allowedBlocks: true,
                            templateLock: false
                        }
                    )
                )
            ]
        );
    },

    save: function(props) {
        return wp.element.createElement(
            'div',
            { className: 'wp-block-csrwiki-admin-only' },
            wp.element.createElement(wp.blockEditor.InnerBlocks.Content)
        );
    }
});
/* 在style.css中 */
.wp-block-csrwiki-admin-only {
    border: 2px dashed #666;
    padding: 20px;
    background: #f9f9f9;
}

.admin-only-header {
    color: #666;
    font-size: 14px;
    margin-bottom: 10px;
    font-weight: bold;
}

/* 编辑器中的样式 */
.editor-styles-wrapper .wp-block-csrwiki-admin-only {
    border: 2px dashed #ff5722;
    background: #fff3e0;
}
// 在functions.php中
function register_admin_only_block() {
    wp_register_script(
        'admin-only-block',
        get_stylesheet_directory_uri() . '/js/admin-only-block.js',
        array('wp-blocks', 'wp-element', 'wp-editor')
    );

    register_block_type('csrwiki/admin-only', array(
        'editor_script' => 'admin-only-block',
        'render_callback' => 'render_admin_only_block'
    ));
}
add_action('init', 'register_admin_only_block');

// 渲染回调函数
function render_admin_only_block($attributes, $content) {
    if(current_user_can('administrator')) {
        return $content;
    }
    return ''; // 非管理员看不到内容
}

这个方案的优点:
1. 一次性解决问题,不用遍历检查每个块
2. 使用更直观,直接把需要保护的内容放在这个块里
3. 在编辑器中有明显的视觉提示(虚线边框)
4. 可以嵌套任何其他块
5. 维护更简单

使用方法就是在编辑器中插入”仅管理员可见”块,然后在里面放入需要保护的内容即可。非管理员访问时这些内容会自动隐藏。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部