Je souhaite avoir un modèle 404 différent pour chaque type de message personnalisé.
par exemple. J'ai post type nom event et le lien sera
domain.com/event/my-event-name
mais si ce lien vers une page qui n'a pas post
domain.com/event/xxxxxxxx
alors il affichera 404 pages, mais je le veux différent du modèle 404.php
, j'essaie de faire entrer le type de message dans 404.php
mais il ne le peut pas car il n'a pas de message à utiliser.
WordPress 4.7 introduit un nouveau filtre qui nous permet de modifier facilement la hiérarchie template :
/**
* 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 );
Pour le type 404, nous pourrions vérifier le chemin actuel, comme suggéré par @cjbj.
Voici un exemple où nous modifions la hiérarchie des modèles 404 en prenant en charge le modèle 404-event.php
, si le chemin actuel correspond au modèle regex ^/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;
} );
Si notre 404-event.php
personnalisé n'existe pas, alors 404.php
est la solution de secours.
Nous pourrions également simplement ajuster le fichier modèle 404.php
à nos besoins, comme suggéré par @EliCohen
Nous pourrions également utiliser l'ancien filtre 404_template
(depuis WordPress 1.5), qui est déclenché après l'appel de la locate_template()
.
Voici un exemple ( 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;
} );
J'espère que vous pourrez le tester plus avant et vous adapter à vos besoins!
Selon la hiérarchie de modèles de WP, vous ne pouvez pas utiliser un autre modèle sur une page 404. comme @Ranuka l'a suggéré, vous pouvez personnaliser votre 404 pour afficher un contenu personnalisé en modifiant le fichier de modèle ou en insérant vos propres messages.
Lisez ceci en premier: https://developer.wordpress.org/themes/basics/template-hierarchy/ puis décidez (et partagez s'il vous plaît) quelle est la solution souhaitée?
Une requête retourne un 404 lorsqu'il n'y a aucun résultat. Donc, le problème sur votre page 404.php
est que vous n’avez aucune connaissance de requête sur ce qui l’a causé. Par conséquent, vous ne pouvez pas tester pour un type de publication.
Ce que vous avez, cependant, est l'URL qui a causé le 404. Selon la façon dont vous définissez vos permaliens, cela peut contenir des informations sur le type de publication. Dans l'exemple que vous donnez, il s'agit de /event/
en tant que chaîne que vous pouvez tester dans votre modèle. Comme ça:
$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;