Modified PHP code
<?php
// First, define these.
$max_cat_count = 32; // this is 'x'
$qty_per_column = 8; // this is 'y'
// Then the $args array.
$args = array(
'taxonomy' => 'product_cat',
'number' => $max_cat_count + 1, // keep the + 1
'hide_empty' => 0,
// ... your other args here ...
);
// Get the categories list.
$get_cats = get_terms( $args );
$get_cats = ( ! is_wp_error( $get_cats ) ) ? $get_cats : [];
// Default thumbnail URL.
$default_thumb = content_url( '/uploads/woocommerce-placeholder-100x100.png' );
$total = count( $get_cats );
$list_number = 1;
$_new_col = false;
$columns="";
foreach ( $get_cats as $i => $cat ) {
if ( $i >= $max_cat_count ) {
break;
}
if ( $i % $qty_per_column === 0 ) {
// Close previous column, if any.
if ( $_new_col ) {
$columns .= '</ul></div><!-- .cat_columns -->';
}
// Open new column.
$id = 'cat-col-' . $list_number;
$columns .= '<div class="menu cat_columns" id="' . $id . '">';
$columns .= '<ul class="hoverimage">';
$_new_col = true;
$list_number++; // increment the columns count
}
if ( $total > $max_cat_count && $i === $max_cat_count - 1 ) {
// Make sure to change the # to the proper URL.
$columns .= '<li class="menu-item"><a href="#">View All</a></li>';
} else {
$thumbnail_id = get_term_meta( $cat->term_id, 'thumbnail_id', true );
$image = $thumbnail_id ? wp_get_attachment_url( $thumbnail_id ) : '';
// If $image is empty, just let it be. JS will set it to $default_thumb.
// That way, the page source/HTML will be less.
$link = '<a href="' . esc_url( get_term_link( $cat ) ) . '">' . esc_html( $cat->name ) . '</a>';
$columns .= '<li class="menu-item" data-image="' . esc_url( $image ) . '">' . $link . '</li>';
}
}
// Close last column, if any.
if ( $_new_col ) {
$columns .= '</ul></div><!-- .cat_columns -->';
}
?>
<div class="design">
<div class="zoom-preview">
<div class="img_container" data-default_thumb="https://wordpress.stackexchange.com/questions/352360/<?php echo esc_url( $default_thumb ); ?>">
</div>
</div>
<?php echo $columns; ?>
<div class="clear"></div>
</div>
Modified jQuery code
jQuery(function( $ ){
var imageContainer=".img_container",
imageList=".hoverimage",
maxWidth="100%"; // parent or specific css width;
var $imageContainer = $(imageContainer).eq(0);
var $imageList = $(imageList);
/*
* I moved this var to here, and use data-default_thumb to specify the
* default thumbnail URL. That way, you can - and should - avoid using
* PHP in JS. So your opening DIV tag would look like:
* <div class="img_container" data-default_thumb="http://example.com/image.png">
*/
var defImage = $imageContainer.data( 'default_thumb' );
if (maxWidth === 'parent') {
maxWidth = $imageContainer.width() + 'px';
}
// Load images and set hover::
$imageList.find('li[data-image]').each(function(index){
if (typeof $(this).data('image') === 'string') {
var thumb_url = $( this ).data( 'image' ) || defImage;
$imageContainer.append(
"<img id='imageToggle"+index+
"' src=""+ thumb_url +
"" style="max-width: "+maxWidth+"; max-height:100%; display:none;" />"
);
$(this).data("image","imageToggle"+index);
$(this).hover(
function(){ loadImage($(this).data('image')); },
function(){ loadImage('imageToggleDef'); }
);
}
});
// Load default:
$imageContainer.append(
"<img id='imageToggleDef"+
"' src=""+defImage+
"" style="max-width: "+maxWidth+"; max-height:100%" />"
);
// Toggle images:
function loadImage(imageId) {
$imageContainer.stop(true).fadeOut('fast', function(){
$(this).find('img').hide();
$(this).find('img#'+imageId).show();
$(this).fadeIn('fast');
});
}
});
Sample CSS code
.cat_columns {
float: left;
width: 20%;
}
.zoom-preview {
float: left;
width: 20%;
text-align: center;
}
.clear {
clear: both;
}
So basically, just “play” with the CSS to get the proper layout — e.g. without the thumbnail preview, the .cat_columns
would have a width of 25%
(to have a total of 4 columns in a row).
And after you implemented all the code, the generated markup/HTML would look something like so:
<div class="design">
<div class="zoom-preview">
<div class="img_container" data-default_thumb="{Default thumbnail URL}">
{Thumbnails added via JS}
</div>
</div>
<div class="menu cat_columns">
<ul class="hoverimage">
<li class="menu-item" data-image="{Thumbnail URL}"><a href="https://wordpress.stackexchange.com/questions/352360/{Category URL}">{Category Name}</a></li>
<li class="menu-item" data-image="{Thumbnail URL}"><a href="https://wordpress.stackexchange.com/questions/352360/{Category URL}">{Category Name}</a></li>
...
</ul>
</div>
<div class="menu cat_columns">
<ul class="hoverimage">
<li class="menu-item" data-image="{Thumbnail URL}"><a href="https://wordpress.stackexchange.com/questions/352360/{Category URL}">{Category Name}</a></li>
<li class="menu-item" data-image="{Thumbnail URL}"><a href="https://wordpress.stackexchange.com/questions/352360/{Category URL}">{Category Name}</a></li>
...
</ul>
</div>
...
<div class="clear"></div>
</div>
Additional Notes
-
The arguments
title_li
,echo
,style
andshow_count
are to be used withwp_list_categories()
, and have no effects inget_terms()
. -
I used
content_url()
to retrieve the WordPress “content” URL which looks likehttp://example.com/wp-content
. -
After you’ve tested everything, you should put the jQuery script in an external script and use the
wp_enqueue_scripts
hook andwp_enqueue_script()
to load the script. (I’ve recently posted this answer which might help you withwp_enqueue_script()
.)
UPDATE
If you want the default thumbnail to be loaded immediately, then you should manually add the <img>
to the HTML:
<!-- With this version, no need for data-default_thumb -->
<div class="img_container">
<img id="imageToggleDef" src="https://wordpress.stackexchange.com/questions/352360/<?php echo esc_url( $default_thumb ); ?>" alt="" style="max-width: 100%; max-height: 100%" />
</div>
You can try a demo here and be sure to use the JS there and not the one originally posted above.