Терминальный контрольный список Walker – отключить родительские категории

В настоящее время у меня есть структура, в которой категории верхнего уровня действуют как целевые страницы, поэтому у них не должно быть должностей, непосредственно связанных с ними. То, что я хотел бы сделать, – отключить термины верхнего уровня и только разрешить пользователю проверять суб-термины (дети). Я нашел ходунка, который преобразует флажки в радиокнопки здесь, но я недостаточно понимаю это, чтобы только изменить родителя верхнего уровня, он продолжает каскадировать. Было надеяться, что кто-то может сломать то, что происходит у этого ходока, и главный вопрос: «Как отключить термины верхнего уровня в терминах метаболизма администратора»,

/** * Use radio inputs instead of checkboxes for term checklists in specified taxonomies. * https://wordpress.stackexchange.com/questions/139269/wordpress-taxonomy-radio-buttons * * @param array $args * @return array */ function wpse_139269_term_radio_checklist( $args ) { if ( ! empty( $args['taxonomy'] ) && ($args['taxonomy'] === 'product_cat') ) { if ( empty( $args['walker'] ) || is_a( $args['walker'], 'Walker' ) ) { if ( ! class_exists( 'WPSE_139269_Walker_Category_Radio_Checklist' ) ) { class WPSE_139269_Walker_Category_Radio_Checklist extends Walker_Category_Checklist { function walk( $elements, $max_depth, $args = array() ) { $output = parent::walk( $elements, $max_depth, $args ); foreach($elements as $element){ if($element->parent == 0){ $output = str_replace( array( 'type="checkbox"', "type='checkbox'" ), array( 'type="checkbox"', "type='checkbox' disabled='disabled'" ), $output ); } } return $output; } } } $args['walker'] = new WPSE_139269_Walker_Category_Radio_Checklist; } } return $args; } add_filter( 'wp_terms_checklist_args', 'wpse_139269_term_radio_checklist' ); 

элементы содержат все члены в массиве, поэтому я использую это для проверки того, имеет ли этот элемент родительский элемент в моем foreach, тогда я пытаюсь заменить некоторый вывод и добавить свой отключенный флаг (так же как связанный вопрос превращает флажки в переключатели).

Solutions Collecting From Web of "Терминальный контрольный список Walker – отключить родительские категории"

Отредактировано, потому что у меня был совершенно неверный вопрос.


Чтобы узнать, является ли термин родителем или нет, нам нужен доступ к термину post parent, поэтому лучше заменить более специализированные методы istead walk() .

Тем не менее, я понимаю, что код в OP использует определение класса внутри функции, чтобы избежать фатальной ошибки из-за Walker_Category_Checklist класс Walker_Category_Checklist не определен, однако код становится едва читаемым таким образом.

Поэтому я думаю, что лучше написать пользовательскую функцию, которая возвращает экземпляр пользовательского ходока:

 add_filter( 'wp_terms_checklist_args', 'wpse_149328_set_walker' ); function wpse_149328_set_walker( $args ) { if ( ! empty( $args['taxonomy'] ) && ( $args['taxonomy'] === 'product_cat' ) // only for 'product_cat' taxonomy && ( ! isset( $args['walker'] ) || ! $args['walker'] instanceof Walker ) ) { $args['checked_ontop'] = FALSE; $args['walker'] = get_Walker_Category_No_Parent(); } return $args; } 

теперь давайте код get_Walker_Category_No_Parent() и пользовательский ходок:

 function get_Walker_Category_No_Parent() { class Walker_Category_No_Parent extends Walker_Category_Checklist { function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { if ( (int) $category->parent === 0 ) { $this->doing_parent = esc_html( $category->name ); } else { parent::start_el( $output, $category, $depth, $args, $id ); } } function end_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { if ( ! isset( $this->doing_parent ) || empty( $this->doing_parent ) ) { parent::end_el( $output, $category, $depth, $args, $id ); } } function start_lvl( &$output, $depth = 0, $args = array() ) { if ( isset( $this->doing_parent ) && ! empty( $this->doing_parent ) ) { $output .= '<li><strong>' . $this->doing_parent . '</strong></li>'; $this->doing_parent = FALSE; } parent::start_lvl( $output, $depth = 0, $args ); } } return new Walker_Category_No_Parent; } 

Этот ходок выводит родительские категории как текст и только если у них есть дети.