WordPress + Timber w/自定义主题 + 路由 - 404 页面不呈现

WordPress + Timber w/ custom theme + routing - 404 page not rendering

我正在使用 Timber and Twig 创建自定义 WordPress 主题,但我很难让我的自定义 404 页面呈现。

最初,我网站上的每个页面都有一个在 functions.php 中定义的自定义路由,而我的 404 逻辑在 index.php 中。这可能不是实现此目的的最佳方法,但这是我可以使其正常工作的唯一方法——我在 Timber 文档中找不到太多关于创建具有自定义主题的 404 页面的信息。

index.php:

<?php
$context = Timber::get_context();
$post = new TimberPost();
$context['page'] = $post;
global $wp;
$url = home_url($wp->request);
$context['url'] = preg_replace('#^https?://#', '', rtrim($url, '/'));

Timber::render('views/pages/404.twig', $context);

在我需要添加通配符路由之前,这一直很有效,这样客户就可以自己添加新页面,而无需要求我们添加新路由。我将此通配符路由添加到 functions.php:

Routes::map('/:page', function($params) {
Routes::load('routes/page.php', $params, null, 200);
});

通配符路由按预期工作,但现在我上面的 404 逻辑不再工作。当我访问不是在 WordPress 管理员中创建的页面的 URL 时,它会将我发送到一个包含随机 post 内容的页面。我对如何让它正常工作有点迷茫,很可能我最初的 404 逻辑不是处理它的正确方法。任何建议都会很棒。

我尝试使用以下代码将 404.php 添加到主题文件夹:

<?php
$context = Timber::get_context();

Timber::render( array(
'views/pages/404.twig'
), $context );

不幸的是,这没有用——随机 URL 我的网站正在随机呈现 post 的内容,而不是 404.twig 文件。

由于您将所有 URL 路由到 'page.php',因此无法呈现“404.php”。首先检查 URL 是否存在并进行相应的路由。在您的 'functions.php' 中这样更改,这可能会解决您的 404 问题。

Routes::map('/:page', function ($params) {
    $is_page_exists = get_page_by_path($params['page']);
    if ($is_page_exists) {
        Routes::load('routes/page.php', $params, null, 200);
    } else {
        Routes::load('404.php', $params, null, 404);
    }
});

然后从您的 'index.php' 中删除 404 相关代码。

我不确定您为什么要添加此自定义路由,因为默认情况下它将由 WordPress / Timber 自动处理(页面 slug 本身)。如果你想要自定义 slug 前缀(比如 http://www.example.com/page/page slug),那么你需要有自定义路由,比如 Routes::map('page/:page', function ($params) { }).