it-swarm-eu.dev

Různé wordpress 404 šablona pro jiný typ příspěvku

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.

4
supersuphot

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!

4
birgire

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í?

1
elicohenator

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