<?php echo get_post_permalink(); ?>
заменить на
<?php echo get_permalink( $cat_post->ID ); ?>
Этот блок
<?php $image = get_field('custom_image_incategory'); ?>
<?php if ( $image ) { ?>
<a href="<?php echo get_permalink( get_the_ID() ) ?>"><img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>" /></a>
<?php } ?>
заменить на
<?php $image = get_field( 'custom_image_incategory', $cat_post->ID ); ?>
<?php if ( $image ) { ?>
<a href="<?php echo get_permalink( $cat_post->ID ) ?>"><img src="<?php echo $image['url']; ?>" alt="<?php echo $image['alt']; ?>" /></a>
<?php } ?>
Поясню.
get_the_ID() - функция не подходит, т.к. вы находитесь за рамками основного цикла query_post WordPress.
Вы проходите командой foreach по вашему массиву объектов $category_posts
Соответственно дальше в коде для получения ID поста нужно использовать $cat_post->ID
Фукнция get_field(). это, вероятно, плагин Advanced Custom Fields. Этой функции также нужно передать ID поста т.к. она находится в рамках вашего цикла foreach. Добавляем вторым параметром также $cat_post->ID