...

Aby dodać możliwość wyboru kategorii dla stron w WordPress, możemy skorzystać z taksonomii. W tym przypadku, najłatwiej jest zarejestrować nową taksonomię dla typu posta „strony” i utworzyć żądane kategorie. W poniższym kodzie PHP zarejestrowano nową taksonomię „page_categories” i utworzono żądane kategorie. W moim wypadku jest to „Ogólne, Dieta, Trening, Suplementacja, Rutyny”. Możesz dodać ten kod do pliku functions.php w aktywnym motywie:


// Rejestrujemy nową taksonomię dla stron
function register_page_categories() {
    $labels = array(
        'name' => 'Kategorie stron',
        'singular_name' => 'Kategoria strony',
        'search_items' => 'Szukaj kategorii stron',
        'all_items' => 'Wszystkie kategorie stron',
        'edit_item' => 'Edytuj kategorię strony',
        'update_item' => 'Zaktualizuj kategorię strony',
        'add_new_item' => 'Dodaj nową kategorię strony',
        'new_item_name' => 'Nazwa nowej kategorii strony',
        'menu_name' => 'Kategorie stron'
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
        'public' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'show_tagcloud' => true,
        'query_var' => true,
        'rewrite' => array('slug' => 'page-category')
    );

    register_taxonomy('page_categories', 'page', $args);
}
add_action('init', 'register_page_categories');

// Dodajemy żądane kategorie
function create_page_categories() {
    $page_categories = array(
        'Ogólne',
        'Dieta',
        'Trening',
        'Suplementacja',
        'Rutyny'
    );

    foreach ($page_categories as $page_category) {
        if (!term_exists($page_category, 'page_categories')) {
            wp_insert_term($page_category, 'page_categories');
        }
    }
}
add_action('init', 'create_page_categories');

Po dodaniu tego kodu do pliku functions.php, powinieneś zobaczyć nową taksonomię „Kategorie stron” w menu „Strony” w panelu administracyjnym WordPress. Jednak ten kod nie dodaje sekcji w klasycznym edytorze, gdzie możemy wybrać za pomocą checkboxa daną kategorię i przypisać ją do danej strony. Dlatego musimy dodać kolejny kod php do pliku functions.php:



function add_page_categories_meta_box() {
    add_meta_box(
        'page_categories_meta_box',     // Unikalne ID
        'Kategorie stron',              // Tytuł
        'page_categories_meta_box_cb',  // Callback
        'page',                         // Post type
        'side',                         // Kontekst
        'default'                       // Priorytet
    );
}
add_action('add_meta_boxes', 'add_page_categories_meta_box');

function page_categories_meta_box_cb($post) {
    $taxonomy = 'page_categories';
    $post_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'ids'));

    $terms = get_terms($taxonomy, array('hide_empty' => false));

    if (!is_wp_error($terms)) {
        foreach ($terms as $term) {
            echo '<p><label><input type="checkbox" name="' . $taxonomy . '[]" value="' . $term->term_id . '" ' . checked(true, in_array($term->term_id, $post_terms), false) . ' />' . $term->name . '</label></p>';
        }
    }
}

function save_page_categories_meta_box_data($post_id) {
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    $taxonomy = 'page_categories';

    // Usuń bieżące kategorie
    wp_delete_object_term_relationships($post_id, $taxonomy);

    // Ustaw nowe kategorie
    if (isset($_POST[$taxonomy])) {
        wp_set_object_terms($post_id, array_map('intval', $_POST[$taxonomy]), $taxonomy);
    }
}
add_action('save_post', 'save_page_categories_meta_box_data');


Teraz mamy komplet. Możemy bez problemu przypisywać stworzone kategorie dla swoich stron. Oczywiście nazwy kategorii możemy zmienić wedle własnego uznania w kodzie numer 1. Kolejną i ostatnią rzeczą jaką wykonamy to dodamy kod, który będzie odpowiedzialny za sortowanie po kategoriach. Do pliku functions.php dodajemy kod numer 3:



// Dodaj filtr kategorii na stronie 'Wszystkie strony'
function add_page_categories_filter() {
    global $typenow;
    
    if ($typenow === 'page') {
        $taxonomy = 'page_categories';
        $selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
        $info_taxonomy = get_taxonomy($taxonomy);
        
        wp_dropdown_categories(array(
            'show_option_all' => __("Pokaż wszystkie {$info_taxonomy->label}"),
            'taxonomy' => $taxonomy,
            'name' => $taxonomy,
            'orderby' => 'name',
            'selected' => $selected,
            'show_count' => true,
            'hide_empty' => true,
            'value_field' => 'slug',
        ));
    }
}
add_action('restrict_manage_posts', 'add_page_categories_filter');

// Filtruj listę stron na podstawie wybranej kategorii
function filter_pages_by_category($query) {
    global $pagenow;
    $taxonomy = 'page_categories';
    
    if (is_admin() && $pagenow === 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] === 'page' && isset($_GET[$taxonomy]) && !empty($_GET[$taxonomy]) && $query->is_main_query()) {
        $query->set('tax_query', array(
            array(
                'taxonomy' => $taxonomy,
                'field' => 'slug',
                'terms' => $_GET[$taxonomy],
            )
        ));
    }
}
add_action('pre_get_posts', 'filter_pages_by_category');



Do ’value_field’ dodałem wartość ’slug’ w funkcji add_page_categories_filter(). Następnie dodałem warunek !empty($_GET[$taxonomy]) w funkcji filter_pages_by_category() aby sprawdzić, czy wartość nie jest pusta.

Po zastosowaniu tego kodu, odśwież stronę „Wszystkie strony” w panelu administracyjnym WordPress i sprawdź, czy teraz działa prawidłowo. Jeśli nadal występują problemy, proszę daj mi znać.

Nie znalazłeś funkcji, która Cię interesuje?
Napisz do mnie.

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *