Edited because I had completely misread question.
To know if term is a parent or not, we need access to term post parent, so is better to replace more specialized methods istead of walk()
.
That said, I understand that code in OP uses class definition inside the function to avoid fatal error because of Walker_Category_Checklist
class not defined, however code becomes hardly readable in that way.
So I think is better write a custom function that return an instance of the custom walker:
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;
}
now let’s code the get_Walker_Category_No_Parent()
and the custom walker:
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;
}
This walker output parent categories as text and only if they have some children.