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

标签 php wordpress routing timber

我正在使用 Timber 创建自定义 WordPress 主题和 Twig我很难让我的自定义 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 时,它会将我发送到一个包含随机帖子内容的页面。我对如何让它正常工作有点迷茫,很可能我最初的 404 逻辑不是处理它的正确方法。任何建议都会很棒。

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

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

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

不幸的是,这没有用——在一个随机的 URL 上,我的网站正在呈现一个随机帖子的内容,而不是 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) { }).

关于php - WordPress + Timber w/自定义主题 + 路由 - 404 页面不呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51901501/

相关文章:

asp.net-mvc - 如何设置 MVC 路由来处理旧的 ASP 经典页面重定向

c++ - 如何指定要在用 C++ 编写的应用程序中使用的特定 NIC (boost asio)

scala - 喷涂路由多个深度路径

php - 通过 Dreamweaver 开发 Jquery、jquery ui、php、mysql、ftp?

PHP回调包含

html - 自定义 CSS - 卡住了,我尝试了各种组合

MySql 根据其他字段更新字段

php - 显示 PHP 为 HTTP 请求制作的确切 header ?

php - 具有跨多个表的相关性的站点搜索的好例子 (php/mysql)

wordpress - 如何在 weDevs 的 Dokan 多供应商插件中的产品缩略图上显示商店名称