web-dev-qa-db-ja.com

創世記のテーマワーク内の一定数の段落の後に広告を追加する

私はそれを感じることができるのでとても親密です。 2段落後に広告ブロックを表示させようとしています。現在、最後の段落の前に広告ブロックを配置するために、functions.phpで次のコードを使用しています。

私は一生の間これを成し遂げるために正しいコードを見つけることができません。

function ads_added_above_last_p($text) {
if( is_single() ) :
    $ads_text = '<div class="wpselect_middle_content">My Ad Code Here</div>';
    if($pos1 = strrpos($text, '<p>')){
        $text1 = substr($text, 0, $pos1);
        $text2 = substr($text, $pos1);
        $text = $text1 . $ads_text . $text2;
    }
endif;
return $text;
}
add_filter('the_content', 'ads_added_above_last_p');

2番目の$ text文字列を再生して$ pos2を入力すると、完全に機能しますが、投稿内のすべてのテキストが複製されます。

任意の助けは大歓迎です。

1
Matthew Snider

私はexplode()が文字列を分解しようとするときに便利であることがわかりました。このコードは、段落の塊の配列を作成し、2つの段落の後に新しいブロックを挿入し、それを連結して出力​​用の文字列に戻します。

function insert_ad_block( $text ) {

    if ( is_single() ) :

        $ads_text = '<div class="wpselect_middle_content">My Ad Code Here</div>';
        $split_by = "\n";
        $insert_after = 2; //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
epilektric