Vytvoření vlastní stránky 404

Chtěli byste si vytvořit vlastní chybovou stránku 404 jednoduše pomocí editoru bloků, tak jako každou jinou stránku? V tomto návodu vám ukáži jak na to. Následující kód se vloží do functions.php
.
/**
* Přidání pole pro výběr stránky 404 na stránku Nastavení > Zobrazování
*
* @author Jan "Wacki" Vašák
* @return void
*/
function add_404_page_select_to_reading_page()
{
// Registrace nastavení
register_setting('reading', 'custom_404_page');
// Přidání pole pro výběr stránky
add_settings_field(
'custom_404_page', // ID
'Stránka 404', // Titulek
'custom_404_page_callback', // Callback funkce pro vykreslení pole se stránkami
'reading', // Stránka, na které se pole zobrazí
'default', // Sekce na stránce
['label_for' => 'custom_404_page'] // Argumenty pro callback funkci
);
}
add_action('admin_init', 'add_404_page_select_to_reading_page');
/**
* Vykreslení pole pro výběr stránky 404
*
* @author Jan "Wacki" Vašák
* @param array $args Argumenty pro vykreslení pole
* @return void
*/
function custom_404_page_callback($args)
{
$custom_404_page = get_option('custom_404_page') ?? 0;
wp_dropdown_pages([
'name' => 'custom_404_page',
'echo' => 1,
'show_option_none' => '— Vyberte —',
'option_none_value' => '0',
'selected' => $custom_404_page,
]);
}
/**
* Uložení nastavení pro stránku 404
*
* @author Jan "Wacki" Vašák
* @return void
*/
function saveCustomOption()
{
if (isset($_POST['custom_404_page'])) :
update_option('custom_404_page', $_POST['custom_404_page']);
endif;
}
add_action('admin_menu', 'saveCustomOption');
Tento kód nám přidal rozbalovátko na stránku Nastavení -> Zobrazování.
Nyní přidáme „štítek“ ke stránce, abychom věděli, že se jedná o stránku 404.
A to uděláme následujícím kódem.
/**
* Přidání "štítku" s chybou 404 do výpisu stránek
*
* @author Jan "Wacki" Vašák
* @param array $postStates Pole s výpisem stavů
* @param WP_Post $post Aktuální stránka
* @example Název stránky - Stránka s chybou 404
* @return array Pole s výpisem stavů
*/
function add_custom_post_state_to_404_page($postStates, $post)
{
// ID stránky 404
$page404Id = get_option('custom_404_page');
// Pokud se aktuální stránka rovná stránce 404, přidá se stav
if ($post->ID == $page404Id) $postStates[] = 'Stránka 404';
return $postStates;
}
add_filter('display_post_states', 'add_custom_post_state_to_404_page', 10, 2);
A nakonec třešnička na dortu a tou je informace, že právě upravujete stránku 404.
<?php
/**
* Přidání upozornění do editace stránky, pokud uživatel upravuje stránku 404
*
* @author Jan "Wacki" Vašák
* @return void
*/
function add_404_page_notice()
{
// Načtení ID stránky 404
$page404Id = get_option('custom_404_page') ?? '';
// Pokud není ID stránky 404 nastaveno, ukončí se funkce
if (empty($page404Id)) return;
global $pagenow, $post;
// Kontrola, zda jsme na stránce pro editaci příspěvku nebo stránky
if ($pagenow == 'post.php' && isset($_GET['action']) && $_GET['action'] == 'edit') :
// Kontrola, zda aktuálně upravovaná stránka je stránka 404
if ($post->ID == $page404Id) :
$message = 'Momentálně upravujete chybovou stránku 404.';
$type = 'warning';
if (empty($message) || empty($type)) return;
?>
<script>
(function(wp) {
wp.data.dispatch('core/notices').createNotice(
'<?php echo sanitize_text_field($type); ?>',
'<?php echo sanitize_text_field($message); ?>', {
isDismissible: false,
}
);
})(window.wp);
</script>
<?php
endif;
endif;
}
add_action('admin_notices', 'add_404_page_notice');
Tímto sice máme vše připravené, ale námi upravená stránka se pořád nezobrazuje. Co s tím? Musíme říct naší stránce 404.php
, že má načíst obsah z naší nově vytvořené 404 stránky. V ukázce je uvedena kompatibilita s pluginem WPML.
<?php
get_header();
// nějaký kód
$custom404pageID = get_option('custom_404_page');
if ($custom404pageID) :
// Pokud je WPML aktivní, pokusíme se najít překlad stránky
if (function_exists('icl_object_id')) {
$custom404pageID = icl_object_id($custom404pageID, 'page', true, ICL_LANGUAGE_CODE);
}
$custom404page = get_post($custom404pageID);
echo apply_filters('the_content', $custom404page->post_content);
endif;
// nějaký kód
get_footer();
Tak a to by bylo všechno, nyní když zadáte špatnou URL adresu, měla by na vás vyskočit nová chybová stránka 404. 🙂