it-swarm.com.de

Verschiedene WordPress 404-Vorlage für verschiedene Beitragstypen

Ich möchte für jeden benutzerdefinierten Beitragstyp eine andere 404-Vorlage haben.

z.B. Ich habe Post-Typ-Name Ereignis und der Link wird sein
domain.com/event/my-event-name

aber wenn es einen link zu einer seite gibt die keinen post hat
domain.com/event/xxxxxxx

dann wird die Seite 404 angezeigt, aber ich möchte, dass sie sich von der Vorlage 404.php unterscheidet. Ich versuche, den Beitragstyp 404.php einzugeben, kann dies jedoch nicht, da es keinen Beitrag gibt, von dem ich ihn erhalten kann.

4
supersuphot

WordPress 4.7 führt einen neuen Filter ein, mit dem wir die Vorlagenhierarchie leicht ändern können :

/**
 * 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 );

Für den Typ 404 können wir den aktuellen Pfad überprüfen, wie von @cjbj vorgeschlagen.

Hier ist ein Beispiel, in dem wir die 404-Vorlagenhierarchie ändern, indem wir die Vorlage 404-event.php unterstützen, wenn der aktuelle Pfad mit dem Regex-Muster ^/event/ übereinstimmt ( 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;
} );

Wenn unser benutzerdefinierter 404-event.php nicht existiert, ist 404.php der Fallback.

Wir können auch einfach die 404.php-Vorlagendatei an unsere Bedürfnisse anpassen, wie von @EliCohen vorgeschlagen

Wir könnten auch den alten 404_template-Filter verwenden (seit WordPress 1.5), der nach dem Aufrufen der locate_template() ausgelöst wird.

Hier ist ein Beispiel ( 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;
} );

Hoffe du kannst es weiter testen und an deine Bedürfnisse anpassen!

4
birgire

Gemäß der Vorlagenhierarchie von WP können Sie keine andere Vorlage für eine 404-Seite verwenden. Wie von @Ranuka vorgeschlagen, können Sie Ihren 404 so anpassen, dass er benutzerdefinierten Inhalt anzeigt, indem Sie die Vorlagendatei bearbeiten oder Ihre eigenen Nachrichten einfügen.

Lesen Sie dies zuerst: https://developer.wordpress.org/themes/basics/template-hierarchy/ und entscheiden Sie dann (und teilen Sie bitte), was Ihre gewünschte Lösung ist?

1
elicohenator

Eine Abfrage gibt 404 zurück, wenn keine Ergebnisse vorliegen. Das Problem auf Ihrer 404.php-Seite ist, dass Sie keine Informationen zu den Ursachen der Abfrage haben. Daher können Sie nicht auf einen Beitragstyp testen.

Was Sie jedoch haben, ist die URL, die den 404 verursacht hat. Abhängig davon, wie Sie Ihre Permalinks eingestellt haben, kann dies Informationen über den Beitragstyp enthalten. In dem von Ihnen angegebenen Beispiel gibt es /event/ als Zeichenfolge, die Sie auf in Ihrer Vorlage testen können. So was:

$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