Chci mít jinou šablonu 404 pro každý typ vlastního příspěvku.
např. Mám název typu příspěvku event a odkaz bude
domain.com/event/my-event-name
ale pokud odkaz na stránku nemá příspěvek
domain.com/event/xxxxxxx
pak se zobrazí 404 stránky, ale chci, aby se liší od šablony 404.php
, snažím se získat typ příspěvku v 404.php
, ale to nemůže, protože nemá příspěvek, ze kterého se dostat.
WordPress 4.7 zavádí nový filtr, který nám umožňuje snadno měnit hierarchii šablony :
/**
* 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 );
Pro typ 404 bychom mohli zkontrolovat aktuální cestu, jak navrhuje @cjbj.
Zde je příklad, kde upravujeme hierarchii šablony 404 podporou šablony 404-event.php
, pokud aktuální cesta odpovídá vzoru ^/event/
regex ( 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;
} );
Pokud náš vlastní soubor 404-event.php
neexistuje, pak 404.php
je nouzový.
Můžeme také upravit soubor šablony 404.php
podle našich potřeb, jak navrhl @EliCohen
Mohli bychom také použít starý filtr 404_template
(od WordPress 1.5), který je spuštěn po volání locate_template()
.
Zde je příklad ( 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;
} );
Doufám, že ho můžete otestovat a přizpůsobit vašim potřebám!
Podle hierarchie šablony WP nelze použít jinou šablonu na stránku 404. jak @Ranuka navrhl, můžete přizpůsobit svůj 404 tak, aby zobrazoval vlastní obsah úpravou souboru šablony nebo vkládáním vlastních zpráv.
Nejprve si přečtěte toto: https://developer.wordpress.org/themes/basics/template-hierarchy/ a pak se rozhodněte (a sdílejte prosím) jaké je vaše požadované řešení?
Dotaz vrátí 404, pokud nejsou žádné výsledky. Takže problém na stránce 404.php
je, že nemáte žádné znalosti o tom, co to způsobilo. Proto nemůžete testovat typ příspěvku.
Co však máte, je adresa URL, která způsobila, že 404. V závislosti na tom, jak nastavíte vaše permalinks, to může obsahovat informace o typu příspěvku. V příkladu, který zadáte, je /event/
jako řetězec , který můžete otestovat pro ve vaší šabloně. Takhle:
$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;