Skip to content

Commit

Permalink
自动提交
Browse files Browse the repository at this point in the history
  • Loading branch information
frankelinli committed Dec 21, 2024
1 parent 626bf5d commit 744a3ba
Show file tree
Hide file tree
Showing 4 changed files with 223 additions and 155 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
---
date: 2024-12-21 18:17
slug: WordPress管理后台设置里添加维护模式开关
---

- 维护模式下返回503状态码,对SEO更友好
- 管理员可以继续正常访问站点
- 简单的开关控制
- 维护模式菜单移到"设置"菜单下

<!-- truncate -->

```php


// 添加维护模式功能
function csrwiki_maintenance_mode() {
// 添加设置菜单 - 放到"设置"下
add_action('admin_menu', function() {
add_options_page(
'维护模式设置',
'维护模式',
'manage_options',
'maintenance-settings',
'csrwiki_maintenance_settings_page'
);
});

// 注册设置
add_action('admin_init', function() {
register_setting('maintenance-settings-group', 'maintenance_mode_active');
});

// 在wp加载早期检查维护模式
add_action('wp', 'csrwiki_check_maintenance_mode');
}
// 检查维护模式状态
function csrwiki_check_maintenance_mode() {
// 如果维护模式已启用且当前用户不是管理员
if (get_option('maintenance_mode_active') && !current_user_can('manage_options')) {
// 确保不是wp-admin页面
if (!is_admin() && !wp_doing_ajax()) {
wp_die(
'<div style="text-align: center; padding: 50px 20px;">
<h1>网站维护中</h1>
<p>我们正在进行系统维护,请稍后再访问。</p>
</div>',
'网站维护中',
array(
'response' => 503,
'back_link' => false,
)
);
}
}
}

// 设置页面HTML
function csrwiki_maintenance_settings_page() {
?>
<div class="wrap">
<h1>维护模式设置</h1>
<form method="post" action="options.php">
<?php settings_fields('maintenance-settings-group'); ?>
<?php do_settings_sections('maintenance-settings-group'); ?>
<table class="form-table">
<tr>
<th scope="row">维护模式状态</th>
<td>
<label>
<input type="checkbox" name="maintenance_mode_active" value="1" <?php checked(1, get_option('maintenance_mode_active'), true); ?> />
启用维护模式
</label>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}

// 初始化维护模式功能
csrwiki_maintenance_mode();
```

### 如果开关不开启,代码就不工作,不会影响性能

是的,性能影响可以忽略不计。让我解释代码执行过程:

1. 插件注册了两个主要行为:
- admin_menu hook:仅在后台运行时加载
- admin_init hook:仅在后台运行时加载
- wp hook:虽然每次都会执行,但只是一个简单的条件判断

2. 具体分析维护模式关闭时的执行流程:
```php
function csrwiki_check_maintenance_mode() {
// 当维护模式未开启时,这个if判断直接返回
if (get_option('maintenance_mode_active') && !current_user_can('manage_options')) {
// 维护模式关闭时,这里面的代码完全不会执行
}
}
```

性能开销极小,原因:
- get_option() 是WordPress核心函数,有内置缓存
- 条件判断失败后立即返回
- 没有额外的数据库查询
- 没有额外的文件加载
- 不会执行任何DOM操作

所以你完全不用担心性能问题。这是一个非常轻量级的功能实现。
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ slug: 如何给wordpress文章设置自定义字段 is doc=true



1. ## 使用WordPress原生自定义字段(最简单):
### 使用WordPress原生自定义字段(最简单):

```php
// 添加到functions.php,显示自定义字段框
function show_is_doc_meta_box() {
Expand Down Expand Up @@ -68,7 +69,8 @@ add_action('save_post', 'save_is_doc_meta');
- 包含一个简单的复选框
- 勾选后该文章就会被标记为文档类

2. ### 使用Quick Edit(快速编辑)方式:
### 使用Quick Edit(快速编辑)方式:

```php
// 在文章列表添加自定义列(已有)
function add_is_doc_column($columns) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,109 @@ if ($block['attrs']['adminOnly'] && !current_user_can('manage_options')) {
1. 更安全 - 敏感内容完全不会传输到客户端
2. 更轻量 - 减少了页面大小
3. 无痕迹 - 查看源码也看不到任何相关信息

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

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

```javascript
// 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)
);
}
});
```

```css
/* 在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;
}
```

```php
// 在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. 维护更简单

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

0 comments on commit 744a3ba

Please sign in to comment.