Docker搭建WordPress并绑定域名教程(一)

这一节我们讲如何通过Docker搭建WordPress并绑定域名,步骤如下:


步骤1:配置域名DNS解析

  1. 登录你的域名注册商(如GoDaddy、阿里云等),进入DNS管理界面。
  2. 添加一条 A记录,将域名指向你的服务器公网IP。
    • 例如:@www 指向 123.123.123.123(你的服务器IP)。
  3. 等待DNS生效(通常几分钟到几小时),可通过 ping yourdomain.com 测试是否解析成功。

步骤2:确保Docker容器端口映射正确

  • 启动WordPress容器时,确保将容器的80/443端口映射到宿主机:
    docker run -d \
    --name wordpress \
    -p 80:80 \
    -p 443:443 \
    -e WORDPRESS_DB_HOST=mysql \
    -e WORDPRESS_DB_USER=root \
    -e WORDPRESS_DB_PASSWORD=your_password \
    wordpress:latest

    提示:如果使用其他端口(如8080),需通过反向代理转发(见步骤3)。


步骤3:配置反向代理(推荐Nginx)

  1. 安装Nginx
    sudo apt update && sudo apt install nginx
  2. 创建Nginx配置文件
    • /etc/nginx/sites-available/yourdomain.com 创建文件,内容如下:
      server {
       listen 80;
       server_name yourdomain.com www.yourdomain.com;
      
       location / {
           proxy_pass http://localhost:80;  # 如果WordPress容器端口映射到宿主机的80
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
       }
      }
  3. 启用配置并重启Nginx
    sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
    sudo nginx -t  # 测试配置
    sudo systemctl restart nginx

步骤4:更新WordPress站点地址

  1. 进入WordPress后台:访问 http://yourdomain.com/wp-admin
  2. 转到 设置 → 常规,修改以下两项为你的域名:
    • WordPress地址(URL)https://yourdomain.com
    • 站点地址(URL)https://yourdomain.com
  3. 保存更改。

步骤5:配置HTTPS(SSL证书)

  1. 使用Certbot自动获取证书
    sudo apt install certbot python3-certbot-nginx
    sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
  2. Certbot会自动修改Nginx配置,启用HTTPS并强制跳转。

步骤6:处理Docker专用网络(可选)

  • 如果使用Docker Compose且包含独立网络(如nginx-proxy),可在docker-compose.yml中添加环境变量:
    services:
    wordpress:
      environment:
        - VIRTUAL_HOST=yourdomain.com
        - LETSENCRYPT_HOST=yourdomain.com
        - [email protected]

常见问题排查

  • DNS未生效:使用 dig yourdomain.com 检查解析结果。
  • 端口冲突:确保宿主机80/443端口未被占用(sudo lsof -i :80)。
  • WordPress重定向错误:清除浏览器缓存或更新.htaccess文件。
  • 混合内容警告:确保站点URL为https://,并安装插件(如Really Simple SSL)。

完成以上步骤后,你的WordPress应能通过域名正常访问。如有问题,检查Docker日志(docker logs wordpress)和Nginx错误日志(/var/log/nginx/error.log)。

Posted in 网络相关 | Tagged , , , | Leave a comment

使用Cloudflare的zero trust内网穿透后,WordPress无法进入后台的解决方法

不少人在使用Cloudflare CDN后,Wordpress无法进入后台,主要是因为使用了Cloudflare的SSL。问deepseek这个问题好久,无法就那么几种方法,结果依然是“Sorry, you are not allowed to access this page”。彻底奔溃。

为解决这个问题,Cloudflare发布了一款Wordpress插件:

Flexible SSL for CloudFlare

使用也很简单,直接后台搜索这个插件,激活即可 。或者下载插件到plugins目录下,然后解压激活。

插件下载:https://wordpress.org/plugins/Cloudflare-flexible-ssl/

Posted in 网络相关 | Tagged , | Leave a comment

前列腺抗原是什么,有什么意义

前列腺抗原通常指的是前列腺特异性抗原(Prostate-Specific Antigen, PSA),它是一种由前列腺上皮细胞产生的蛋白质,主要存在于精液中,少量会进入血液。PSA的检测在男性健康(尤其是前列腺疾病)的筛查、诊断和监测中具有重要意义。


PSA的临床意义

  1. 前列腺癌的筛查与早期发现

    • PSA是前列腺癌的重要肿瘤标志物。血液中PSA水平升高可能提示前列腺癌风险,尤其是当数值明显高于正常范围时(通常正常值<4 ng/mL,但需结合年龄和个体差异)。
    • 早期前列腺癌可能无症状,PSA检测可帮助在症状出现前发现异常,从而尽早干预。
  2. 辅助诊断前列腺疾病

    • 前列腺癌:PSA升高可能提示癌症,但需结合直肠指检(DRE)、影像学(如MRI)和前列腺活检确诊。
    • 良性前列腺增生(BPH):良性前列腺肥大或炎症(如前列腺炎)也可能导致PSA轻度升高。
    • 前列腺炎:感染或炎症会暂时性升高PSA水平。
  3. 监测治疗效果与复发

    • 前列腺癌患者接受手术、放疗或激素治疗后,PSA水平会下降。
    • 治疗后PSA再次升高可能提示癌症复发或转移。
  4. 风险评估与预后判断

    • PSA水平越高,前列腺癌的恶性程度可能越高。
    • PSA检测还可结合其他指标(如PSA密度、PSA速度、游离PSA与总PSA比值)提高诊断准确性。

PSA的局限性

  1. 非特异性:PSA升高并非前列腺癌特有,良性前列腺疾病、尿路操作(如导尿)、骑自行车或射精后也可能导致短暂升高。
  2. 假阴性/假阳性风险:部分前列腺癌患者PSA可能正常(假阴性),而部分良性病变患者PSA升高(假阳性)。
  3. 过度诊断争议:PSA筛查可能导致过度活检和治疗(如对惰性癌的过度干预)。

建议

  • 筛查人群:一般建议50岁以上男性定期检测PSA;有前列腺癌家族史或非裔男性可提前至45岁。
  • 结果解读:需由医生结合临床症状、其他检查(如MRI、活检)综合判断,避免仅凭PSA单一指标下结论。
  • 动态监测:PSA短期内的快速上升(PSA速率)比单次绝对值更有意义。

总之,PSA是前列腺健康管理的重要工具,但需科学看待其意义和局限性,结合临床全面评估。如有异常,应及时就医进一步检查。

Posted in Resourse | Leave a comment

阿普唑仑(Alprazolam)和艾司唑仑

阿普唑仑(Alprazolam)和艾司唑仑(Estazolam)均属于苯二氮䓬类药物,但两者在药理特性、适应症及临床应用上存在一定差异。以下是主要区别:


1. 适应症

  • 阿普唑仑

    • 主要用途:焦虑症、恐慌症(尤其是急性焦虑发作)。
    • 特点:抗焦虑作用强,起效快(15-30分钟起效),对急性焦虑或恐慌发作效果显著。
  • 艾司唑仑

    • 主要用途:失眠(尤其是入睡困难或睡眠维持障碍)。
    • 特点:镇静催眠作用突出,适合短期失眠治疗。

2. 药效持续时间

  • 阿普唑仑:中短效药物,半衰期约 11-16小时,需每日多次服药。
  • 艾司唑仑:中长效药物,半衰期约 10-24小时,单次服药可维持整夜睡眠。

3. 副作用

  • 共同副作用:嗜睡、头晕、肌肉无力、记忆力下降等。
  • 差异
    • 阿普唑仑更易引起 情绪波动(如易怒)和 戒断反应(如突然停药可能引发反跳性焦虑)。
    • 艾司唑仑因作用时间长,次日残留效应(如困倦)可能更明显。

4. 成瘾性与依赖风险

  • 阿普唑仑:依赖性较高,长期使用后戒断症状(如震颤、抽搐)较严重。
  • 艾司唑仑:依赖风险相对较低,但仍需避免长期使用。

5. 代谢途径

  • 阿普唑仑:主要通过 肝脏CYP3A4酶 代谢,与葡萄柚、抗真菌药等联用可能增加血药浓度。
  • 艾司唑仑:经肝脏代谢,但受CYP3A4影响较小,药物相互作用风险较低。

总结

  • 焦虑/恐慌症:优先选择 阿普唑仑(需警惕依赖)。
  • 失眠:优先选择 艾司唑仑(注意次日嗜睡)。
  • 关键提醒:两者均需严格遵医嘱,避免长期或过量使用,停药时应逐渐减量。

如有具体症状或用药疑问,建议咨询专业医生,切勿自行调整用药方案。

Posted in Resourse | Leave a comment

WordPress所见即所得发布方法总结

根据错误提示,问题出在 <textarea> 元素上。具体原因是:

  1. <textarea> 被隐藏

    • TinyMCE 初始化后,会将原始的 <textarea> 隐藏(设置为 display: nonevisibility: hidden)。
    • 由于 <textarea> 被隐藏,浏览器无法对其进行验证(即使设置了 required 属性)。
  2. required 属性冲突

    • 你为 <textarea> 设置了 required 属性,但隐藏的表单控件无法通过浏览器的默认验证。

解决方法

方法 1:移除 required 属性

如果 TinyMCE 编辑器已经确保内容不为空,可以移除 <textarea>required 属性。

<textarea name="content" id="content" placeholder="在此输入内容..."></textarea>

方法 2:手动验证内容

在表单提交时,手动检查 TinyMCE 的内容是否为空。

document.querySelector('form').onsubmit = function() {
    var content = tinymce.get('content').getContent(); // 获取 TinyMCE 内容
    if (!content.trim()) {
        alert('内容不能为空!');
        return false; // 阻止表单提交
    }
    document.querySelector('textarea[name="content"]').value = content; // 同步到 textarea
};

方法 3:隐藏 <textarea> 但不影响验证

<textarea> 设置为透明且不可见,但仍然占据空间,以便通过浏览器验证。

<textarea name="content" id="content" placeholder="在此输入内容..." required
          style="opacity: 0; height: 0; width: 0; position: absolute;"></textarea>

方法 4:禁用浏览器默认验证

在表单中添加 novalidate 属性,禁用浏览器的默认验证,完全依赖 JavaScript 验证。

<form method="POST" action="" novalidate>

修复后的完整代码

以下是结合 方法 2方法 4 的修复代码:

<?php
// 加载 WordPress 环境
require_once('../wp-load.php');

// 检查是否提交了表单
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['content']) && isset($_POST['title'])) {
    // 检查 nonce 和用户权限
    if (!isset($_POST['markdown_publish_nonce']) || !wp_verify_nonce($_POST['markdown_publish_nonce'], 'markdown_publish_action')) {
        echo '<div class="error">安全验证失败,请重试。</div>';
    } elseif (!current_user_can('publish_posts')) {
        echo '<div class="error">你没有权限发布文章。</div>';
    } else {
        // 获取表单数据
        $title = sanitize_text_field($_POST['title']);
        $content = $_POST['content']; // TinyMCE 输出的 HTML 内容
        $category = isset($_POST['category']) ? intval($_POST['category']) : 0; // 分类 ID
        $tags = isset($_POST['tags']) ? sanitize_text_field($_POST['tags']) : ''; // 标签

        // 发布文章
        $post_id = wp_insert_post([
            'post_title'   => $title,
            'post_content' => $content,
            'post_status'  => 'publish', // 直接发布
            'post_author'  => get_current_user_id(), // 当前用户为作者
            'post_category' => [$category], // 分配分类
        ]);

        if ($post_id) {
            // 分配标签
            if (!empty($tags)) {
                wp_set_post_tags($post_id, $tags);
            }

            echo '<div class="success">文章发布成功!<a href="' . get_permalink($post_id) . '">查看文章</a></div>';
        } else {
            echo '<div class="error">文章发布失败,请重试。</div>';
        }
    }
}

// 获取所有分类
$categories = get_categories(['hide_empty' => false]);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>所见即所得发布工具</title>
    <!-- 引入 TinyMCE -->
    <script src="https://cdn.tiny.cloud/1/你的API Key/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
    <script>
        tinymce.init({
            selector: '#content', // 绑定到 textarea
            height: 500, // 编辑器高度
            menubar: false, // 隐藏菜单栏
            plugins: [
                'advlist autolink lists link image charmap print preview anchor',
                'searchreplace visualblocks code fullscreen',
                'insertdatetime media table paste code help wordcount'
            ],
            toolbar: 'undo redo | formatselect | bold italic backcolor | \
                       alignleft aligncenter alignright alignjustify | \
                       bullist numlist outdent indent | removeformat | help',
            init_instance_callback: function(editor) {
                console.log('TinyMCE 初始化完成'); // 检查初始化是否成功
            }
        });

        // 表单提交时同步 TinyMCE 内容
        document.querySelector('form').onsubmit = function() {
            var content = tinymce.get('content').getContent(); // 获取 TinyMCE 内容
            if (!content.trim()) {
                alert('内容不能为空!');
                return false; // 阻止表单提交
            }
            document.querySelector('textarea[name="content"]').value = content; // 同步到 textarea
        };
    </script>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .publish-tool {
            max-width: 800px;
            margin: 20px auto;
            padding: 20px;
            border: 1px solid #ccc;
            background-color: #f9f9f9;
        }
        .publish-tool textarea {
            width: 100%;
            height: 200px;
            padding: 10px;
            font-size: 16px;
        }
        .publish-tool .buttons {
            margin-top: 10px;
        }
        .publish-tool .buttons button {
            padding: 10px 20px;
            font-size: 16px;
            margin-right: 10px;
            cursor: pointer;
        }
        .success {
            color: green;
            margin: 10px 0;
        }
        .error {
            color: red;
            margin: 10px 0;
        }
    </style>
    <script>
        // 重置表单
        function resetForm() {
            tinymce.get('content').setContent(''); // 清空 TinyMCE 内容
            document.querySelector('input[name="title"]').value = '';
            document.querySelector('select[name="category"]').selectedIndex = 0;
            document.querySelector('input[name="tags"]').value = '';
        }
    </script>
</head>
<body>
    <div class="publish-tool">
        <h1>所见即所得发布工具</h1>
        <form method="POST" action="" novalidate>
            <?php wp_nonce_field('markdown_publish_action', 'markdown_publish_nonce'); ?>
            <div>
                <label for="title">标题:</label>
                <input type="text" name="title" id="title" required>
            </div>
            <div>
                <label for="content">内容:</label>
                <textarea name="content" id="content" placeholder="在此输入内容..."></textarea>
            </div>
            <div>
                <label for="category">分类:</label>
                <select name="category" id="category">
                    <?php foreach ($categories as $cat): ?>
                        <option value="<?php echo $cat->term_id; ?>"><?php echo $cat->name; ?></option>
                    <?php endforeach; ?>
                </select>
            </div>
            <div>
                <label for="tags">标签(用逗号分隔):</label>
                <input type="text" name="tags" id="tags">
            </div>
            <div class="buttons">
                <button type="submit" name="publish">发布</button>
                <button type="button" onclick="resetForm()">重置</button>
            </div>
        </form>
    </div>
</body>
</html>

测试步骤

  1. 打开页面,确保 TinyMCE 编辑器正常加载。
  2. 输入标题和内容,选择分类和标签。
  3. 点击“发布”按钮,检查是否有成功或失败的提示信息。
  4. 如果内容为空,会弹出提示“内容不能为空!”并阻止表单提交。

如果还有其他问题,欢迎继续提问!

Posted in 网络相关 | Leave a comment

自动下载文章中的所有远程图片,并将它们保存到本地

错误信息表明 wp_generate_attachment_metadata 函数未定义。这是因为在 WordPress 中,wp_generate_attachment_metadata 函数位于 wp-admin/includes/image.php 文件中,而这个文件默认不会在插件或主题中自动加载。


解决方法

在调用 wp_generate_attachment_metadata 之前,需要手动引入 wp-admin/includes/image.php 文件。以下是修复后的代码:

php
复制
<?php
/*
Plugin Name: MY Auto Save Remote Image
Plugin URI: http://www.devsaab.com/wordpress/
Description: This plugin automatically downloads all remote images from a post and saves them locally.
Version: 1.4
Author: Prebhdev Singh
Disclaimer: No warranty or guarantee of any kind! Use this at your own risk.
*/

add_action('publish_post', 'fetch_images');

function fetch_images($post_ID) {
    // 检查是否正在自动保存
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    // 检查用户权限
    if (!current_user_can('edit_post', $post_ID)) {
        return;
    }

    // 引入 WordPress 图像处理函数
    require_once(ABSPATH . 'wp-admin/includes/image.php');

    // 获取文章内容
    $post = get_post($post_ID);
    $updated = $post->post_content;

    // 提取所有图片 URL
    if (preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches)) {
        $first_images = $matches[1];

        foreach ($first_images as $first_image) {
            // 检查图片域名是否与当前站点一致
            if (strpos($first_image, $_SERVER['HTTP_HOST']) === false) {
                // 处理 HTTPS
                $first_image = str_replace('http://', 'https://', $first_image);

                // 下载图片
                $get = wp_remote_get($first_image);
                if (!is_wp_error($get)) {
                    $type = wp_remote_retrieve_header($get, 'content-type');
                    if (strpos($type, 'image') === false) {
                        continue; // 如果不是图片,跳过
                    }

                    // 生成唯一文件名
                    $filename = wp_unique_filename(wp_upload_dir()['path'], rawurldecode(basename($first_image)));

                    // 保存图片
                    $mirror = wp_upload_bits($filename, '', wp_remote_retrieve_body($get));

                    if (!$mirror['error']) {
                        // 创建附件
                        $attachment = array(
                            'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
                            'post_mime_type' => $type
                        );
                        $attach_id = wp_insert_attachment($attachment, $mirror['file'], $post_ID);

                        if (!is_wp_error($attach_id)) {
                            // 生成附件元数据并更新
                            $attach_data = wp_generate_attachment_metadata($attach_id, $mirror['file']);
                            wp_update_attachment_metadata($attach_id, $attach_data);

                            // 替换文章中的图片 URL
                            $updated = str_replace($first_image, $mirror['url'], $updated);
                        }
                    } else {
                        error_log('Failed to save image: ' . $first_image);
                    }
                } else {
                    error_log('Failed to download image: ' . $first_image);
                }
            }
        }

        // 更新文章内容
        if ($updated !== $post->post_content) {
            wp_update_post(array('ID' => $post_ID, 'post_content' => $updated));
        }
    }
}
?>

关键修复点

  1. 引入 wp-admin/includes/image.php

    • 在函数开头添加以下代码:

      php
      复制
      require_once(ABSPATH . 'wp-admin/includes/image.php');
    • 这确保了 wp_generate_attachment_metadata 函数可用。

  2. 确保文件路径正确

    • ABSPATH 是 WordPress 根目录的绝对路径,确保路径拼接正确。


测试步骤

  1. 将修复后的代码保存为 my-auto-save-remote-image.php

  2. 上传到 WordPress 的 wp-content/plugins/ 目录。

  3. 在 WordPress 后台激活插件。

  4. 发布一篇包含远程图片的文章,检查插件是否正常工作。


注意事项

  1. 权限问题

    • 确保 WordPress 的上传目录(wp-content/uploads)有正确的写权限。

  2. HTTPS 支持

    • 如果远程图片使用 HTTPS,确保服务器支持 HTTPS 请求。

  3. 性能监控

    • 如果文章中有大量图片,可能会影响发布速度,建议监控服务器性能。

Posted in 网络相关 | Leave a comment

wordpress 发布markdown内容及格式问题解决方案

你提到的问题是:Markdown 转换后的文章在 WordPress 中格式不正确,尤其是代码部分无法完美显示。这是因为 WordPress 默认使用纯文本格式保存文章内容,而 Markdown 中的代码块、标题、列表等格式需要特定的处理才能正确显示。

以下是解决这个问题的几种方法:


1. 保留 Markdown 格式

如果你希望文章在 WordPress 中仍然保留 Markdown 格式(如代码块、标题、列表等),可以将 Markdown 转换为 HTML,并将 HTML 内容直接保存到 WordPress 文章中。

修改代码

在发布文章时,不要将 Markdown 转换为纯文本,而是直接保存为 HTML:

// 使用 Parsedown 解析 Markdown
$parsedown = new Parsedown();
$content = $parsedown->text($markdown); // 直接保存为 HTML

// 发布文章
$post_id = wp_insert_post([
    'post_title'   => $title,
    'post_content' => $content, // 保存 HTML 内容
    'post_status'  => 'publish',
    'post_author'  => get_current_user_id(),
    'post_category' => [$category],
]);

优点

  • 代码块、标题、列表等格式可以正确显示。
  • 不需要额外的插件或主题支持。

缺点

  • 文章内容以 HTML 格式保存,可能会影响某些 WordPress 主题的样式。

2. 使用 Markdown 插件

WordPress 本身不支持 Markdown,但可以通过插件来实现 Markdown 解析和显示。以下是推荐的两款插件:

插件 1:WP Githuber MD

  • 这是一个功能强大的 Markdown 插件,支持实时预览、代码高亮等功能。
  • 安装方法:
    1. 在 WordPress 后台,进入“插件” -> “安装插件”。
    2. 搜索“WP Githuber MD”,安装并激活。
    3. 在文章编辑器中,切换到 Markdown 模式。

插件 2:Jetpack

  • Jetpack 是 WordPress 官方推出的多功能插件,其中包含 Markdown 支持。
  • 安装方法:
    1. 在 WordPress 后台,进入“插件” -> “安装插件”。
    2. 搜索“Jetpack”,安装并激活。
    3. 启用 Markdown 模块:进入 Jetpack 设置,找到“Markdown”模块并启用。

修改代码

如果你使用 Markdown 插件,可以直接将 Markdown 内容保存到文章中,插件会自动解析并显示:

// 直接保存 Markdown 内容
$content = $markdown;

// 发布文章
$post_id = wp_insert_post([
    'post_title'   => $title,
    'post_content' => $content, // 保存 Markdown 内容
    'post_status'  => 'publish',
    'post_author'  => get_current_user_id(),
    'post_category' => [$category],
]);

优点

  • 插件会自动处理 Markdown 解析和显示。
  • 支持代码高亮、表格等高级功能。

缺点

  • 需要安装额外的插件。

3. 使用代码高亮插件

如果文章中的代码部分无法正确显示,可以安装代码高亮插件,例如:

插件:SyntaxHighlighter Evolved

  • 这是一个流行的代码高亮插件,支持多种编程语言。
  • 安装方法:
    1. 在 WordPress 后台,进入“插件” -> “安装插件”。
    2. 搜索“SyntaxHighlighter Evolved”,安装并激活。
    3. 在文章中使用 [code] 短代码包裹代码块。

修改代码

在发布文章时,将代码块用 [code] 短代码包裹:

// 使用 Parsedown 解析 Markdown
$parsedown = new Parsedown();
$html = $parsedown->text($markdown);

// 将代码块用 [code] 短代码包裹
$content = preg_replace('/<pre><code>(.*?)</code></pre>/s', '[code]$1[/code]', $html);

// 发布文章
$post_id = wp_insert_post([
    'post_title'   => $title,
    'post_content' => $content, // 保存包含短代码的内容
    'post_status'  => 'publish',
    'post_author'  => get_current_user_id(),
    'post_category' => [$category],
]);

优点

  • 代码部分可以高亮显示。
  • 支持多种编程语言。

缺点

  • 需要安装额外的插件。

4. 自定义 CSS 样式

如果你希望手动控制文章的样式,可以在 WordPress 主题中添加自定义 CSS。

修改主题的 style.css

  1. 打开当前主题的 style.css 文件(位于 wp-content/themes/your-theme/style.css)。
  2. 添加以下样式:
/* 代码块样式 */
pre {
    background-color: #f4f4f4;
    padding: 10px;
    border-radius: 5px;
    overflow-x: auto;
}

code {
    font-family: Consolas, Monaco, monospace;
    font-size: 14px;
    color: #d63384;
}

/* 标题样式 */
h1, h2, h3, h4, h5, h6 {
    margin-top: 1.5em;
    margin-bottom: 0.5em;
    font-weight: bold;
}

h1 { font-size: 2em; }
h2 { font-size: 1.75em; }
h3 { font-size: 1.5em; }
h4 { font-size: 1.25em; }
h5 { font-size: 1em; }
h6 { font-size: 0.875em; }

/* 列表样式 */
ul, ol {
    margin-left: 20px;
    margin-bottom: 1em;
}

li {
    margin-bottom: 0.5em;
}

优点

  • 完全自定义文章样式。
  • 不需要安装插件。

缺点

  • 需要手动编写和维护 CSS。

总结

根据你的需求,可以选择以下方案:

  1. 保留 Markdown 格式:将 Markdown 转换为 HTML 并保存。
  2. 使用 Markdown 插件:安装 WP Githuber MD 或 Jetpack,直接保存 Markdown 内容。
  3. 使用代码高亮插件:安装 SyntaxHighlighter Evolved,将代码块用短代码包裹。
  4. 自定义 CSS 样式:在主题中添加自定义 CSS,手动控制文章样式。

推荐使用 Markdown 插件(如 WP Githuber MD),因为它可以自动处理 Markdown 解析和代码高亮,同时保持文章的格式正确。

Posted in 网络相关 | Tagged | Leave a comment

5岁孩子睡前吃手指改善方法

孩子5岁仍保留睡前吃手指的习惯,这是常见的自我安抚行为,但长期可能影响牙齿和手指健康。以下分步骤提供温和的改善方案,家长可根据孩子性格灵活调整:
第一步:理解行为背后的需求
• 观察触发场景:记录孩子吃手指时的状态(如睡前焦虑、无聊、特定环境)
• 睡前10分钟谈心:用「今天什么事情让你最开心/有点担心?」开启对话,帮助孩子释放情绪
第二阶段:建立替代安抚系统

引入「睡眠伙伴」仪式

让孩子挑选专属的安抚物(如触感柔软的玩偶、有妈妈香味的方巾)
设计「哄睡伙伴入睡」游戏:「小熊也困了,你能用手轻轻拍它睡觉吗?」

触觉替代方案

提供硅胶安抚项链(选择可啃咬的安全材质)
睡前手部按摩:用温热的燕麦乳涂抹双手,边按摩边讲故事

第三阶段:游戏化戒除策略
• 21天挑战日历:制作星空主题打卡表,每天成功用「魔法手环」(装饰手链)代替吃手,就贴一颗星星
• 手指冒险故事:编创手指精灵的故事,如「大拇指队长说,如果晚上好好休息,明天就能更有力气搭积木城堡」
第四阶段:生理防护+正向反馈

无害防护:使用透气指套或创可贴(让孩子选择喜欢的图案),强调「这是保护手指的超级英雄盾牌」
进步奖励:不以「整天不吃手」为标准,而是奖励阶段性进步,如「连续3天手指干爽」可获得「延长15分钟绘本时间」

特殊情况处理:
若观察到伴随咬指甲、揪头发等行为,或半年未见改善,建议:

儿童牙医检查牙齿咬合情况
通过沙盘游戏等非侵入方式了解潜在焦虑源
考虑感觉统合训练(如黏土游戏、豆袋按压等触觉脱敏)

关键要点:
• 避免在过渡期频繁提及「不许吃手」,用「我们试试新方法」替代否定句式
• 重大生活变化期间(如入园、分房)可暂时放宽要求
• 家长同步处理自身焦虑,避免将压力传递给孩子
通常通过2-3个月的耐心引导,多数孩子能自然过渡。过程中请保持「进步比完美更重要」的心态,每个小突破都值得庆祝。

Posted in 生活 | Tagged | Leave a comment

终于实现了照片备份到NAS的终极方案(感觉一般,不过PhotoPrism不错)

为什么要存到NAS

一直不愿意用一些云相册或者网盘之类的服务来备份和保存自己的照片,主要是两个原因:

  1. 不想自己的隐私被这些服务方一直视奸,你传上去的照片视频肯定会被这些服务方扫描一遍的,就算没有私密的照片,我也接受不了隐私被这样侵犯
  2. 不想自己的数据被绑架,毕竟数据是别人手上,哪天别人要跑路或者涨价,你也没有任何办法

过于尝试的方案

群晖 moments

最开始NAS装了群晖,于是就用了群晖自带的moments来同步照片.用了一段时间后出现了一些问题:

  1. moments app几乎不再更新,体验不算差,但绝对不好,老婆总是抱怨ios上这不好用那不好用
  2. 与群晖绑定,因为必须搭配moments服务端一起使用,所以你没有任何别的选择,这让我感觉很被动

现在似乎群晖已经淘汰moments了,出了新的群晖photos,这个我没有试用过,因为群晖硬件还是太贵了,现在已经改用Unraid了

PhotoPrism – 超好用

不得不说PhotoPrism确实太好用了,我最喜欢它的一点是他的兼容性很强,你只要丢给它一个目录,他就能处理里面的所有照片,并且可以在各个维度进行检索,对于超大量的照片来说真的很好用.

但问题就在于PhotoPrism只有服务端,把照片同步到NAS这个动作还要我自己想办法来完成

PhotoSync – 不值得这个价格

这个app的功能还是可以的,但是它的UI和交互是在是有点古老,我还需要专门用一个app来进行同步这个事情,最重要的是要付费才能用,我觉得不太值得,放弃.

Nextcloud – 移动端app太差

Nextcloud作为网盘来说挺好用的,我尝试使用Nextcloud的移动端来同步相册照片.但我真的安装了安卓端app后,连接了我https反代后的URL居然直接崩溃了,完全没法用,放弃.

Alist + Pho + Rclone + PhotoPrism – 终极方案

这个方案最让我喜欢的一点是各个环节都不是耦合的,去掉其中任何一个环节都不会影响到其他环节,每个人完全可以根据自己的喜好来替换其中的某个部分.

Alist

官网https://alist.nn.ci/zh/
负责把各种可用的储存映射成webdav,支持各种云盘网盘以及本地储存
Alist

Pho

官网https://pho.tools/
负责通过webdav上传照片到Alist映射的储存
它很好的一点是支持加密后上传,这样就可以在网盘上做二次备份,在能避免隐私泄露的前提下多一层数据保险
而且我可以在手机上直接用这个app来浏览我本地和已经上传的照片,这个app的UI和交互都很好,可以直接用它来代替系统自带的相册
Pho

Rclone

官网https://rclone.org/
负责把Alistwebdav映射到NAS的文件系统内,来把照片喂给PhotoPrism

PhotoPrism

官网https://www.photoprism.app/
最终的”集大成者”,全家所有设备备份的照片最终全部喂到这里,即使是海量照片也能根据它快速索引到自己想找的照片
PhotoPrism

最终效果

平时手机上浏览和上传

使用Pho浏览本地和最近上传的照片

查找和浏览过去某个时候的照片

根据信息用PhotoPrism检索即可

Posted in 生活 | Leave a comment

清理桌面,整理系统

其实也不是很难,花了半个小时就搞定了,主要是工具太强大了!

虽然360很鄙视他,不过存在即道理,的确很不错,清理起来很方便很快捷。清理了1g的垃圾文件,卸载了一些不用的垃圾软件,更新了系统,很快速。明显感觉系统速度得到了提升。

我现在使用本本有个心得,就是不关机,盒上屏幕就自动待机了。爽。开机也快,,哈哈,开启系统及硬件监控,进程/硬件什么的看的一清二楚,爽字一个了得!

只是文件删除了很多,全部删除,不愿动的地方就随他去了。BTW,kugou音乐真垃圾。听了20首,愣是没听到上档次的,郁闷啊!闹的很。

现在这个blog算是彻底费了,垃圾评论一堆,有意思么?后台几天不看,居然2w多的垃圾评论,想来也好笑的,这个zcde.com郁闷处于黑名单,你发垃圾评论有意思么??? 有意思么????
刚后台DELETE from wp_comments WHERE comment_approved = ‘0’;
写完这个帖子,赫然发现comments unapproved 47~God!

想转移blog,虽然不写很长时间,记得当时买下fastdomain就是想打着长期不动的打算,不过计划永远敢不上计划,突然发现虽然blogger处于协和的状态,虽然用的人很少,可是有关系么??有关系么?于是ssh上blogger看来下,很多垃圾文章,于是all 清除,结果所有文章也一并清除了,郁闷啊。。这,可如何是好。。想到导入,结果提示服务器错误。只好继续弄了,现在对blog有点疲劳,blogger也没什么好的发布软件,只能通过邮件发布,貌似也不够灵活,失败失败,看来只好整合一个图床,然后自己随便ftp发布到自己的空间上了!只是评论也是个问题,基于也没什么人来看,搞个第三方的评论???听起来不错

完蛋,这个spam太威猛了,鉴于这个帐号有好几个blog,每个blog都是spam泛滥,没的办法,我怀疑每秒都有spam不停的进入,真郁闷,也就我说话的功夫,已经100条spam了,这速度,刚直接“此网页无法访问。”,这。看来还得来狠的。
UPDATE wp_post SET comment_status=’close’
spam威猛,猛于虎也!

难得,居然遭遇服务器故障,造成了至少二十分钟的宕机,这也太强悍了,正好被我抓到,我还以为垃圾评论太多,不堪重负呢。
想想还是算了。直接加个数学加减验证得啦,spam,你能来的更猛烈些么?

世界总算清净了!

Posted in 生活 | 2 Comments