Skip to content
Advertisement

If product category has children remove permalink from parent term in WooCommerce

Inspired from get woocommerce categories with subcategory, I am creating a drop down section and I was wondering if there is any way to remove the permalink from the parent category if it has a child category.

Here is my code example:

<?php
     $args = array(
     'taxonomy' => 'product_cat',
     'hide_empty' => false,
     'parent'   => 0
    );

    $product_cat = get_terms( $args );

    $thumbnail_id = get_woocommerce_term_meta( $term_id, 'thumbnail_id', true );
    $image        = wp_get_attachment_url( $thumbnail_id );

    foreach ($product_cat as $term){

     $term_link = get_term_link( $term, 'product_cat' );
     $thumb_id    = get_woocommerce_term_meta( $term->term_id, 'thumbnail_id', true );
     $img_src     = wp_get_attachment_url( $thumb_id );
    
    //if parent category has children remove link

    echo '<ul>
          <li><img src="' . $img_src . '"/><a href="'.get_term_link($term->term_id).'">'.$term->name.'</a>
          <ul>';

    // else keep the parent link

    $child_args = array(
        'taxonomy' => 'product_cat',
        'hide_empty' => false,
        'parent'   => $term->term_id
    );

    $child_product_cats = get_terms( $child_args );

    foreach ($child_product_cats as $child_product_cat){

    echo '<li><a href="'.get_term_link($child_product_cat->term_id).'">'.$child_product_cat->name.'</a></li>';

    }

    echo '</ul>
    </li>
    </ul>';
}

How can I display a link on top level product categories terms only when there are no children terms?

Advertisement

Answer

The following will display a list of product category terms where the top level term will not be linked if they have any child term:

<?php
$taxonomy     = 'product_cat';

$parent_terms = get_terms( array(
    'taxonomy'   => $taxonomy,
    'hide_empty' => false,
    'parent'     => 0
) );

echo '<ul>';

// Loop through top level terms
foreach ( $parent_terms as $parent_term ) {
    $term_link  = get_term_link( $parent_term, 'product_cat' );
    $thumb_id   = get_woocommerce_term_meta( $parent_term->term_id, 'thumbnail_id', true );
    $image_html = $thumb_id > 0 ? '<img src="' . wp_get_attachment_url( $thumb_id ) . '"/>' : '';

    // Get children terms
    $child_terms = get_terms( array(
        'taxonomy'   => $taxonomy,
        'hide_empty' => false,
        'parent'     => $parent_term->term_id
    ) );

    // 1. There are children terms
    if( ! empty($child_terms) ) {
        echo '<li>' . $image_html . $parent_term->name . '</li>
        <ul>';

        // Loop through children terms
        foreach ( $child_terms as $term ) {
            $term_link = get_term_link( $term->term_id, $taxonomy );

            echo '<li><a href="' . $term_link . '">' . $term->name . '</a></li>';
        }

        echo '</ul>';
    }
    // 2. There are NOT children terms
    else {
        $parent_term_link = get_term_link( $parent_term->term_id, $taxonomy );

        echo '<li>' . $image_html . '<a href="' . $parent_term_link . '">' . $parent_term->name . '</a></li>';
    }
}
echo '</ul>';

Tested and works.

User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement