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