Blog

Vytvoření vlastní stránky 404

4 minuty čtení

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. 🙂

Načítám komentáře...