web-dev-qa-db-ja.com

さまざまな投稿タイプのさまざまなワードプレス404テンプレート

カスタム投稿タイプごとに異なる404テンプレートが必要です。

例えば。投稿タイプ名が イベント でリンクは
domain.com/event/my-event-name

ただし、投稿のないページにリンクしている場合
domain.com/event/xxxxxxx

それから404ページが表示されますが、404.phpテンプレートとは異なるものにしたいのですが、404.phpで投稿タイプを取得しようとしますが、取得する投稿がないためできません。

4
supersuphot

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正規表現パターン( PHP 5.4+ )に一致する場合、^/event/テンプレートをサポートすることによって404テンプレート階層を変更する例を示します。

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が代替となります。

@EliCohenが提案しているように、404.phpテンプレートファイルを必要に応じて調整することもできます。

locate_template()が呼び出された後に発生する、古い404_templateフィルタ(WordPress 1.5以降)を使用することもできます。

これが例です( 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;
} );

さらにテストして、ニーズに合わせて調整できることを願います。

4
birgire

WPのテンプレート階層に従って、404ページに別のテンプレートを使用することはできません。 @Ranukaが示唆したように、テンプレートファイルを編集するか、あなた自身のメッセージを挿入することによって、あなたの404をカスタマイズしてカスタムコンテンツを表示することができます。

これを最初に読んでください: https://developer.wordpress.org/themes/basics/template-hierarchy/ それからあなたが望む解決策は何ですか(そして共有してください)?

1
elicohenator

結果がない場合、クエリは404を返します。だから、あなたの404.phpページの問題は、それが何を引き起こしたのかについての問い合わせの知識がないということです。したがって、投稿タイプをテストすることはできません。

あなたが持っているのは、しかし、404を引き起こしたURLです。あなたのパーマリンクをどのように設定するかに応じて、これは投稿タイプについての情報を含むかもしれません。この例では、テンプレート内の テストできる文字列 として/event/があります。このような:

$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;
1
cjbj