从 ZBlog 到 WordPress:一个业余博主的建站心路历程

作为一名博主,我对建站的热情始于对内容创作和个性化网站的追求。多年来,我尝试过各种内容管理系统(CMS),从国内流行的 ZBlog 到国际化的 WordPress,每一步都充满了探索与挑战。今天,我想分享我在 ZBlog 建站的经历,特别是那段为实现弹窗登录 API 而奋斗的日子,以及最终转向 WordPress 的心路历程。

初识 ZBlog:简单而灵活的起点我的建站之旅始于 ZBlogPHP,这是一个轻量、易用的国人开发的 CMS,非常适合个人博客和小型网站。ZBlog 的安装过程简单,社区支持也不错,尤其是它的插件和主题生态让我这个新手感到友好。我选择了拓源主题(Toyean Theme),一款设计简洁、响应式布局的主题,特别适合展示文章和图片内容。

20250825090351548-image

拓源主题的默认样式已经很美观,但作为一个喜欢折腾的业余博主,我当然不会满足于“开箱即用”。我花了不少时间修改主题的 CSS 和 PHP 模板,调整配色、字体、布局,甚至添加了一些动态效果,比如悬浮按钮和自定义导航栏。经过一番努力,网站变得既符合我的审美,又带有浓厚的个人风格,看着自己的成果上线,成就感满满。然而,真正让我投入大量精力的,是一个看似简单的功能——弹窗登录系统。

20250825090514665-image

弹窗登录的野心:打造无缝用户体验作为一个追求用户体验的博主,我希望网站能有一个现代化的弹窗登录界面,而不是传统的登录页面跳转。弹窗登录不仅美观,还能让用户在不离开当前页面的情况下快速登录,提升交互体验。于是,我开始着手开发一套基于拓源主题的弹窗登录系统,前端使用 HTML、CSS 和 jQuery,后端则需要调用 ZBlog 的登录 API。前端部分相对顺利。我设计了一个简洁的登录弹窗,包含用户名、密码、记住我(保存登录状态的天数)等字段,通过 AJAX 发送请求到后端 API。代码如下:

<div id="loginModal" style="display:none;">
    <form id="loginForm">
        <input type="text" name="username" placeholder="用户名" required>
        <input type="password" name="password" placeholder="密码" required>
        <input type="number" name="savedate" value="30" min="0">
        <input type="hidden" name="scrtoken" value="<?php echo md5(uniqid(rand(), true)); ?>">
        <button type="submit">登录</button>
    </form>
</div>
<script>
    $('#loginForm').on('submit', function(e) {
        e.preventDefault();
        $.ajax({
            url: '<?php echo $zbp->host; ?>api/user',
            type: 'POST',
            data: $(this).serialize() + '&action=login',
            dataType: 'json',
            success: function(response) {
                if (response.success) {
                    alert('登录成功!');
                    window.location.href = response.redirect;
                } else {
                    alert(response.message);
                }
            }
        });
    });
</script>

后端 API(api/user.php)则是难点。我希望通过 ZBlog 的内置方法验证用户登录,但这让我陷入了长达数天的调试困境。API 登录的坎坷之路ZBlogPHP 的登录逻辑主要依赖 zb_system/function/c_system_event.php 中的 VerifyLogin 函数,以及用户模型的密码验证机制。为了实现 API 登录,我尝试了多种方法来验证用户名和密码:

  1. 直接调用 VerifyLogin: 我最初尝试直接使用 VerifyLogin 函数,设置必要的 POST 数据:
    $_POST['username'] = $username;
    $_POST['password'] = $password;
    $_POST['savedate'] = $savedate;
    $_POST['csrfToken'] = $scrtoken;
    if (VerifyLogin(true, true, true)) {
        echo json_encode(['success' => true, 'message' => '登录成功!']);
    } else {
        echo json_encode(['success' => false, 'message' => '登录失败']);
    }
     
    但总是返回失败,日志显示“Path must not be empty”。
  2. 手动密码验证

    为了绕过可能的错误,我尝试手动验证密码,参考了 manual_verify_password 的逻辑:

    $member = $zbp->GetMemberByName($username);
    if ($member && $member->ID > 0) {
        $passwordCorrect = manual_verify_password($member, $password);
        if ($passwordCorrect) {
            $zbp->SetCurrentMember($member);
            VerifyLogin(true, true, true);
        }
    }

    我还尝试了直接比较哈希:

    $computedHash = Member::GetPassWordByGuid($password, $member->Guid);
    if ($computedHash === $member->Password) {
        // 登录逻辑
    }
    日志显示密码哈希匹配数据库(e3b5bb9298e28cc406ae31231802222b),但登录仍然失败。
  3. 其他尝试
  • 检查 $zbp->cookiespath$zbp->cookie_domain,强制设置为 /www.moucuo.com
  • 禁用 AppCentre 插件,怀疑其钩子干扰。
  • 增加详细日志,记录 $_SERVER、会话 ID 和 ZBlog 配置。
尽管我花了好几天,查阅了 ZBlog 社区、官方文档和 GitHub,甚至翻看了 c_system_event.phpc_system_member.php,但始终无法解决错误。日志中还出现了“Call to undefined function complete_zblog_login()”,让我怀疑是 AppCentre 插件或某个未加载的文件导致问题。

放弃 ZBlog,转向 WordPress

在尝试了无数方法后,我逐渐意识到 ZBlog 的 API 和插件生态存在局限性。ZBlog 虽然轻量,但在处理复杂自定义需求时,文档不足、社区支持有限,尤其是 API 登录相关的错误难以定位。我开始考虑其他 CMS,最终选择了 WordPress。WordPress 是一个功能丰富、生态完善的 CMS,拥有庞大的插件和主题库,以及详细的开发文档。迁移到 WordPress 后,我迅速找到了适合的主题(例如 Astra),并通过插件(如 WP REST API 或 LoginWP)实现了弹窗登录功能。以下是一个简单的 WordPress 登录 API 示例:

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/login', array(
        'methods' => 'POST',
        'callback' => function (WP_REST_Request $request) {
            $username = $request->get_param('username');
            $password = $request->get_param('password');
            $user = wp_signon(array(
                'user_login' => $username,
                'user_password' => $password,
                'remember' => true
            ));
            if (is_wp_error($user)) {
                return new WP_REST_Response(array('success' => false, 'message' => $user->get_error_message()), 401);
            }
            return new WP_REST_Response(array('success' => true, 'message' => '登录成功!', 'redirect' => home_url('/dashboard')));
        }
    ));
});
通过 WordPress 的 REST API,我在一天内完成了弹窗登录功能,前端代码几乎无需修改,只需将 AJAX URL 改为 /wp-json/custom/v1/login。WordPress 的用户认证机制(wp_signon)简单可靠,社区插件如 JWT Authentication 还支持更复杂的 API 认证需求。

总结与感悟

从 ZBlog 到 WordPress 的转变,对我来说既是技术上的妥协,也是对 CMS 选择的重新思考。ZBlog 适合轻量博客,拓源主题让我快速搭建了一个漂亮的网站,但它的开发灵活性和文档支持在面对复杂需求时显得不足。WordPress 虽然更重型,但其成熟的生态和丰富的开发资源让我少走了很多弯路。作为一名业余博主,我学到的不仅是技术,还有如何在有限的时间和精力下选择合适的工具。ZBlog 的经历让我积累了 PHP 开发和调试的经验,也让我更珍惜 WordPress 的便利性。现在,我的博客运行在 WordPress 上,弹窗登录流畅运行,访问量也在稳步增长。未来,我会继续探索 CMS 的可能性,但这段从 ZBlog 到 WordPress 的旅程,将永远是我建站故事中难忘的一章。
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 共1条

请登录后发表评论