I have a plugin where I want to output ads after X number of posts on the home page. The home page is step 1, but things like archives should be possible too once I get the code for the home page.
How do I hook in to post loops and say something like “after every loop, increment a counter, and then if the counter = my number, output an ad”. I can write all the logic for this code myself, but where to hook/implement my code is confusing.
You can try the following:
Method 1:
We can inject the ads via the the_post
action, in the main loop:
add_action( 'loop_start', 'wpse_141253_loop_start' );
function wpse_141253_loop_start( $query )
{
if( $query->is_main_query() )
{
add_action( 'the_post', 'wpse_141253_the_post' );
add_action( 'loop_end', 'wpse_141253_loop_end' );
}
}
function wpse_141253_the_post()
{
static $nr = 0;
if( 0 === ++$nr % 4 )
echo '<div> -------- MY AD HERE ------- </div>';
}
function wpse_141253_loop_end()
{
remove_action( 'the_post', 'wpse_141253_the_post' );
}
Method 2:
We can also inject the ads via the the_content
filter, in the main loop:
add_action( 'loop_start', 'wpse_141253_loop_start' );
function wpse_141253_loop_start( $query )
{
if( $query->is_main_query() )
{
add_filter( 'the_content', 'wpse_141253_the_content' );
add_action( 'loop_end', 'wpse_141253_loop_end' );
}
}
function wpse_141253_the_content( $content )
{
static $nr = 0;
if( 0 === ++$nr % 4 )
$content .= '<div>------- MY AD HERE -------</div>';
return $content;
}
function wpse_141253_loop_end()
{
remove_action( 'the_post', 'wpse_141253_the_content' );
}
Hopefully you can modify this to your needs.