每隔n段添加一条广告

时间:2017-01-18 作者:user2115227

我目前有一些代码,用于在以下3段之后添加自定义字段(广告):

//Insert ads after third paragraph of single post content.
function insert_ad_block( $text ) {

if ( is_single() ) :



    $ads_text = \'<div class="center">\' . get_field(\'blog_post_ad\', \'option\') . \'</div>\';
    $split_by = "\\n";
    $insert_after = 3; //number of paragraphs

    // make array of paragraphs
    $paragraphs = explode( $split_by, $text);

    // if array elements are less than $insert_after set the insert point at the end
    $len = count( $paragraphs );
    if (  $len < $insert_after ) $insert_after = $len;

    // insert $ads_text into the array at the specified point
    array_splice( $paragraphs, $insert_after, 0, $ads_text );

    // loop through array and build string for output
    foreach( $paragraphs as $paragraph ) {
        $new_text .= $paragraph; 
    }

    return $new_text;

endif;

return $text;

}
add_filter(\'the_content\', \'insert_ad_block\');
这目前运行良好。但是,我想修改它,使其每3段添加相同的代码。因此,如果一篇博客文章有9段,那么广告将显示在第3、6和9段之后。

我不太确定怎么做。请帮忙!:)

1 个回复
最合适的回答,由SO网友:Pedro Coitinho 整理而成

我能想到的最简单的方法是浏览段落,在段落中添加广告文本:

function insert_ad_block( $text ) {

    if ( is_single() ) :

        $ads_text = \'<div class="center">\' . get_field(\'blog_post_ad\', \'option\') . \'</div>\';
        $split_by = "\\n";
        $insert_after = 3; //number of paragraphs

        // make array of paragraphs
        $paragraphs = explode( $split_by, $text);

            if ( count( $paragraphs ) > $insert_after ) {

                        $new_text = \'\';     // new text
                        $i = 1;             // current ad index

                        // loop through array and build string for output
                        foreach( $paragraphs as $paragraph ) {
                            // add paragraph, preceeded by an ad after every $insert_after
                            $new_text .= ( $i % $insert_after == 0 ? $ads_text : \'\' ) . $paragraph;
                            // increase index
                            $i++;
                        }

                        return $new_text;
            }


            // otherwise just add the ad to the end of the text
            return $text . $ads_text;

    endif;

    return $text;

}
add_filter(\'the_content\', \'insert_ad_block\');
此脚本跟踪查看的段落$i 并在每个$insert_after. 索引从1开始计数(不是0),以避免打开带有广告的帖子。此脚本可能需要一些微调。

作为旁注,在确定段落时使用换行符可能有点棘手,因为它可以在列表的中间引入广告,或者在用户试图分隔项目时将多个广告放在彼此的顶部。对于易读性,也许它值得寻找</p> 并且很晚才运行过滤器(之后wpautop). 这实际上是一个平衡您的业务目标与用户体验的问题。

希望这就是你想要的:)

相关推荐

添加到数组并通过do_action/Apply_Filters传递它

作为练习,我正在使用PHPclass to add meta boxes 我在GitHub上找到了。我只是复制了代码,现在我正在玩它来理解它。其工作原理如下:包含该类的文件包含在init中。在该文件内部,但在类外部,有一个空数组$meta_boxes 已初始化之后,使用apply_filters. 我猜是apply_filters 使用而不是do_action 因为后者不返回任何内容——$meta_boxes = apply_filters( \'cmb_meta_boxes\', $meta_boxes