The loop_end WordPress PHP action fires once the loop has ended.
Usage
add_action('loop_end', 'my_custom_function'); function my_custom_function($query) { // your custom code here }
Parameters
$query
(WP_Query) – The WP_Query instance (passed by reference).
More information
See WordPress Developer Resources: loop_end
Examples
Add a custom message after the loop
Add a message after the loop has ended on a specific post type.
add_action('loop_end', 'add_custom_message'); function add_custom_message($query) { if ($query->is_main_query() && is_post_type_archive('product')) { echo '<strong>Thanks for browsing our products!</strong>'; } }
Display related posts after the loop
Show related posts based on categories after the loop has ended.
add_action('loop_end', 'display_related_posts'); function display_related_posts($query) { if ($query->is_main_query() && is_single()) { // Get the current post's categories $categories = get_the_category(); // Get related posts based on the categories $related_posts = new WP_Query(array( 'category__in' => wp_list_pluck($categories, 'term_id'), 'posts_per_page' => 3, 'post__not_in' => array(get_the_ID()) )); // Display the related posts if ($related_posts->have_posts()) { echo '<h3>Related Posts:</h3>'; echo '<ul>'; while ($related_posts->have_posts()) { $related_posts->the_post(); echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>'; } echo '</ul>'; } } }
Add pagination after the loop
Display pagination after the loop has ended on a custom post type archive page.
add_action('loop_end', 'add_custom_pagination'); function add_custom_pagination($query) { if ($query->is_main_query() && is_post_type_archive('portfolio')) { echo paginate_links(); } }
Display a custom message if no posts found
Show a custom message if no posts are found after the loop has ended.
add_action('loop_end', 'display_no_posts_message'); function display_no_posts_message($query) { if ($query->is_main_query() && !$query->have_posts()) { echo '<strong>No posts found. Please check back later.</strong>'; } }
Reset post data after the loop
Manually reset the post data after the loop has ended.
add_action('loop_end', 'reset_post_data_custom'); function reset_post_data_custom($query) { if ($query->is_main_query()) { wp_reset_postdata(); } }