不同帖子类型的不同WordPress 404模板

时间:2016-11-15 作者:supersuphot

我想有不同的404模板为每一个自定义职位类型。

我有职位类型名称event 链接将是域。com/事件/我的事件名称

但如果它链接到没有post域的页面。com/event/xxxxxxx

然后它将显示404页,但我希望它不同于404.php 模板,我尝试获取帖子类型404.php 但它不能,因为它没有一个帖子可以从中获取。

3 个回复
最合适的回答,由SO网友:birgire 整理而成

WordPress 4.7引入了一个新的过滤器,允许我们轻松修改模板层次结构:

/**
 * Filters the list of template filenames that are searched for when retrieving 
 * a template to use.
 *
 * The last element in the array should always be the fallback 
 * template for this query type.
 *
 * Possible values for `$type` include: \'index\', \'404\', \'archive\', \'author\', \'category\', 
 * \'tag\', \'taxonomy\', \'date\', \'embed\', home\', \'frontpage\', \'page\', \'paged\', \'search\', 
 * \'single\', \'singular\', and \'attachment\'.
 *
 * @since 4.7.0
 *
 * @param array $templates A list of template candidates, in descending order of priority.
 */
$templates = apply_filters( "{$type}_template_hierarchy", $templates );
对于404类型,我们可以按照@cjbj的建议检查当前路径。

下面是一个示例,我们通过支持404-event.php 模板,如果当前路径与^/event/ 正则表达式模式(PHP 5.4+):

add_filter( \'404_template_hierarchy\', function( $templates ) 
{    
    // Check if current path matches ^/event/ 
    if( ! preg_match( \'#^/event/#\', add_query_arg( [] ) ) )
        return $templates;

    // Make sure we have an array           
    if( ! is_array( $templates ) )
        return $templates;

    // Add our custom 404 template to the top of the 404 template queue
    array_unshift( $templates, \'404-event.php\' );

    return $templates;
} );
如果我们的习惯404-event.php 那就不存在了404.php 是后备方案。

我们也可以调整404.php 根据@EliCohen的建议,模板文件符合我们的需要

我们也可以用旧的404_template 过滤器(自WordPress 1.5起),在locate_template() 被调用。

下面是一个示例(PHP 5.4+):

add_filter( \'404_template\', function( $template ) 
{
    // Check if current path matches ^/event/ 
    if( ! preg_match( \'#^/event/#\', add_query_arg( [] ) ) )
        return $template;

    // Try to locate our custom 404-event.php template    
    $new_404_template = locate_template( [ \'404-event.php\'] );

    // Override if it was found    
    if( $new_404_template )
        $template = $new_404_template;

    return $template;
} );
希望您能进一步测试,并根据您的需要进行调整!

SO网友:elicohenator

根据WP的模板层次结构,您不能对404页面使用不同的模板。正如@Ranuka所建议的,您可以通过编辑模板文件或插入自己的消息来定制404以显示自定义内容。

请先阅读以下内容:https://developer.wordpress.org/themes/basics/template-hierarchy/ 然后决定(请分享)你想要的解决方案是什么?

SO网友:cjbj

当没有结果时,查询返回404。那么,你的404.php 页面是您不知道是什么导致了它。因此,您不能测试post类型。

然而,您所拥有的是导致404的url。根据您设置永久链接的方式,这可能包含有关帖子类型的信息。在您给出的示例中/event/ 作为string you could test for 在模板中。像这样:

$url = $_SERVER[\'REQUEST_URI\']; // this will return: /event/my-wrong-event-name or so
if (false === strpos ($url, \'/event/\')) // important note: use ===, not ==
   ... normal 404 message
else
   ... event 404 message;

相关推荐

Updating modified templates

我想调整一些。php模板文件在我的WordPress主题中,我知道正确的过程是将相关文件复制到子主题文件夹中并在那里编辑文件,这样我的修改就不会在将来的主题更新中丢失。但这是否意味着我将无法从主题更新中获益,因为我将文件放在了我的子主题文件夹中?这可能不是一件好事,因为主题更新可能添加了一些有用的特性,甚至修复了我最初需要对代码进行调整的问题!这方面的常见解决方案是什么?有人推荐了一款Diff应用程序——这是人们常用的吗?