web-dev-qa-db-fra.com

Modèle Wordpress 404 différent pour un type de message différent

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.

4
supersuphot

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!

4
birgire

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?

1
elicohenator

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