Walker{}
Клас для відображення різних деревоподібних структур. Використовується як основа створення свого, дочірнього класу.
У дочірніх класах зазвичай слід описати такі методи:
- Walker::start_lvl() — Starts the list before the elements are added.
- Walker::end_lvl() — Ends the list of after the elements are added.
- Walker::start_el() – Starts the element output.
- Walker::end_el() — Ends the element output, якщо потрібно.
На основі цього класу працюють такі класи:
У ядрі WordPress
- Walker_Nav_Menu() — клас ядра WordPress, який генерує HTML код списку елементів навігаційного меню WordPress.
- Walker_Category_Checklist() — Core walker class to output an unordered list of category checkbox input elements.
- Walker_CategoryDropdown() — Core class, використовуваний для створення HTML dropdown list of Categories.
- Walker_Comment() — Core walker class used to create an HTML list of comments.
- Walker_PageDropdown() — Core class, використовуваний для створення HTML drop-down list of pages.
- Walker_Category() — Core class використовується для створення HTML list of categories.
- Walker_Page() — Core walker class used to create an HTML list of pages.
У WooCommerce
- WC_Product_Cat_Dropdown_Walker() — Product category dropdown walker class.
- WC_Product_Cat_List_Walker() — Product cat list walker class.
Основа для:
Walker_Nav_Menu()
Walker_Nav_Menu()
Хуків немає.
Повертає
Нічого.
Використання
$ Walker = новий Walker ();
// Використовуйте методи класу
Властивості класу
-
$tree_type
(рядок) (public) - Що опрацьовує клас.
-
$db_fields
(рядок) (public) - Використовувані поля БД.
-
$max_pages
(число) (public) -
Максимальна кількість елементів для обходу.
За замовчуванням: 1 -
$has_children
(логічний) (public) -
Має поточний елемент дочірні елементи (
true ) чи ні (
false ). Використовується у методі
start_el() .
Методи класу
- public display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output )
- public end_el( &$output, $data_object, $depth = 0, $args = array() )
- public end_lvl( &$output, $depth = 0, $args = array() )
- public get_number_of_root_elements( $elements )
- public start_el( &$output, $data_object, $depth = 0, $args = array(), $current_object_id = 0 )
- public start_lvl( &$output, $depth = 0, $args = array() )
- public unset_children( $element, &$children_elements )
- public start_lvl( &$output, $depth = 0, $args = array() )
(public)- Формує, наприклад, тег
<ul> , що відкриває дочірнього списку.- end_lvl( &$output, $depth = 0, $args = array() )
(public)- Формує, наприклад, тег, що закриває
</ul> дочірнього списку, який відкривається за допомогою методу
start_lvl() .- start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 )
(public)- Формує, наприклад, тег
<li> , що відкриває, з внутрішнім вмістом.- end_el( &$output, $object, $depth = 0, $args = array() )
(public)- Формує, наприклад, тег, що закриває
</li> .Ці методи не обов’язково описувати у дочірньому класі:
-
walk( $elements, $max_depth )
(public) -
Основний метод, який запускається першим. Повертає сформований HTML код на основі переданого масиву об’єктів елементів, з яких треба побудувати список або іншу структуру (плоску або деревоподібну). Працює на основі методу
display_element() . -
display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output )
(public) -
Відображає один елемент, якщо дочірніх елементів немає або більше, якщо є. Коли елемент має вкладеність, то метод замикається сам на себе, проходячи всі рівні вкладеності вглиб. Максимальна вкладеність визначена аргументом
$max_depth
. Якщо
$max_depth = 1 , будуть оброблені лише елементи першого рівня, а дочірні пропущені. Цей метод не слід викликати безпосередньо, натомість використовуйте метод
walk() . Для формування елементів використовує методи
start_el() ->
start_lvl() ->
end_lvl() ->
end_el() . -
paged_walk( $elements, $max_depth, $page_num, $per_page )
(public) -
Створює сторінку вкладених елементів. Враховуючи масив ієрархічних елементів, максимальну глибину, конкретний номер сторінки та кількість елементів на сторінці, цей метод спочатку визначає всі кореневі елементи верхнього рівня, що належать цій сторінці, а потім перераховує їх та всіх дітей у ієрархічному порядку. Працює на основі методів
display_element() і
unset_children . Наочним прикладом є використання методу класом
Walker_Comment , створюючи список із коментарів, у тому числі й дочірніх. -
get_number_of_root_elements( $elements )
(public) - Обчислює загальну кількість кореневих елементів.
-
unset_children( $e, &$children_elements )
(public) - Відкріплює всі дочірні елементи від заданого верхнього рівня. Метод замикається сам на себе у випадку, якщо вкладеність більша за 1, щоб обійти всю ієрархію переданих елементів.
Приклади
#1 Приклад створення та використання класу
Створимо свій обробник, щоб вивести чекбокси для категорій:
class Walker_My_Checklist extends Walker { public $tree_type = 'term'; $db_fields = array( 'parent' => 'parent', 'id' => 'term_id', ); public function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("t", $depth); $output .= "$indent<ul class='children'>n"; } public function end_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("t", $depth); $output .= "$indent</ul>n"; } public function start_el( &$output, $term, $depth = 0, $args = array(), $current_object_id = 0 ) { $taxonomy = $args['taxonomy']; $name = "tax_input[$taxonomy]"; $class = 'class="category-li"'; $args['selected_cats'] = array_map( 'intval', $args['selected_cats'] ?? [] ); $is_selected = in_array( $term->term_id, $args['selected_cats'], true ); $is_disabled =! empty( $args['disabled'] ); $str = ' <li id="{id}" {class}> <label class="selectit"> <input value="{term_id}" type="checkbox" name="{input_name}" id="{input_id}"{checked}{disabled} /> {name} </label>'; $output .= strtr( $str, [ '{id}' => "{$taxonomy}-{$term->term_id}", '{class}' => $class, '{term_id}' => $term->term_id, '{input_name}' => "{$name}[]", '{input_id}' => "in-$taxonomy-$term->term_id", '{checked}' => checked( $is_selected, true, false ), '{disabled}' => disabled( $is_disabled, true, false ), '{name}' => esc_html( $term->name ), ]); } public function end_el( &$output, $data_object, $depth = 0, $args = array() ) { $output .= "</li>n"; } }
Тепер використовуємо цей клас так:
$taxonomy = 'категорія'; $terms = get_terms(['taxonomy' => $taxonomy]); $walker = новий Walker_My_Checklist; $output = $walker->walk( $terms, 0, [ 'taxonomy' => $taxonomy ] ); echo htmlspecialchars( $output );
Отримаємо:
<li id="category-3" class="category-li"> <label class="selectit"> <input value="3" type="checkbox" name="tax_input[category][]" id="in-category-3"/> Wordpress </label> <ul class='children'> <li id="category-5" class="category-li"> <label class="selectit"> <input value="5" type="checkbox" name="tax_input[category][]" id="in-category-5"/> Авторські Функції </label></li> <li id="category-9" class="category-li"> <label class="selectit"> <input value="9" type="checkbox" name="tax_input[category][]" id="in-category-9"/> Адмінка </label></li> </ul> </li> <li id="category-1" class="category-li"> <label class="selectit"> <input value="1" type="checkbox" name="tax_input[category][]" id="in-category-1"/> Чи не WordPress </label> <ul class='children'> <li id="category-33" class="category-li"> <label class="selectit"> <input value="33" type="checkbox" name="tax_input[category][]" id="in-category-33"/> Корисні дрібниці </label></li> <li id="category-1374" class="category-li"> <label class="selectit"> <input value="1374" type="checkbox" name="tax_input[category][]" id="in-category-1374"/> Сервіси та хостинги </label></li> </ul> </li>
- Формує, наприклад, тег
нотатки
- Пакет: WordPress
список змін
З версії 2.1.0 | Введено. |