在300个单词之后但在段落的结束标记之后在内容中插入文本

时间:2017-03-15 05:10:48

标签: php wordpress

我正在寻找一种方法,可以在x个单词之后插入广告或文字,并在段落的结束标记之后插入最后一个单词。

到目前为止,我只能在x个字符后执行此操作。这种方法的问题在于计算html字符会产生不准确的结果。

function chars1($content) {

  // only inject google ads if post is longer than 2500 characters
  $enable_length1 = 2500;
  // insert after the 210th character
  $after_character1 = 2100;
  if (is_single() && strlen($content) > $enable_length1) {
    $before_content1 = substr($content, 0, $after_character1);
    $after_content1 = substr($content, $after_character1);
    $after_content1 = explode('</p>', $after_content1);

   ob_start();
   dynamic_sidebar('single-image-ads-1');
   $text1 = ob_get_contents();
   ob_end_clean();

   array_splice($after_content1, 1, 0, $text1);
   $after_content1 = implode('', $after_content1);
   return $before_content1 . $after_content1;
}
else {
   return $content;
  }
}
//add filter to WordPress with priority 49
add_filter('the_content', 'chars1',49);

我尝试的另一种方法是使用

strip_tags($content)

并使用

计算单词
st_word_count()

问题在于我无法使用html标签返回$content

根据帖子的大小,我会插入最多5个广告单元,使用上面提到的功能,我需要为每个广告创建一个功能。如果有办法使用一个很棒的功能插入所有5个广告。

任何帮助都是预先准备好的

2 个答案:

答案 0 :(得分:1)

决定什么是单词通常很难。但是,如果您对一个近似解决方案没有问题,比如将一个单词定义为两个空格之间的文本,我建议您自己实现一个简单的函数。

这可以通过迭代字符串的字符直到计算150个单词然后跳到当前段落的末尾来实现。插入广告然后重复,直到您添加了足够的广告。

在您的函数中实现此功能可能如下所示

function chars1($content) {
    // only inject google ads if post is longer than 2500 characters
    $enable_length1 = 2500;

    // Insert at the end of the paragraph every 300 words
    $after_word1 = 300;

    // Maximum of 5 ads
    $max_ads = 5;

    if (strlen($content) > $enable_length1) {
        $len = strlen($content);
        $i=0;

        // Keep adding untill end of content or $max_ads number of ads has ben inserted
        while($i<$len && $max_ads-->0) {
            // Work our way untill the apropriate length
            $word_cout = 0;
            $in_tag = false;
            while(++$i < $len && $word_cout < $after_word1) {
                if(!$in_tag && ctype_space($content[$i])) {
                    // Whitespace
                    $word_cout++;
                }
                else if(!$in_tag && $content[$i] == '<') {
                    // Begin tag
                    $in_tag = true;
                    $word_cout++;
                }
                else if($in_tag && $content[$i] == '>') {
                    // End tag
                    $in_tag = false;
                }
            }

            // Find the next '</p>'
            $i = strpos($content, "</p>", $i);
            if($i === false) {
                // No more paragraph endings
                break;
            }
            else {
                // Add the length of </p>
                $i += 4;

                // Get ad as string
                ob_start();
                dynamic_sidebar('single-image-ads-1');
                $ad = ob_get_contents();
                ob_end_clean();

                $content = substr($content, 0, $i) . $ad . substr($content, $i);

                // Set the correct i
                $i+= strlen($ad);
            }
        }
    }

    return $content;
}

通过这种方法,可以轻松添加新规则。

答案 1 :(得分:0)

我必须自己做这件事。这就是我做到的。首先在</p>标签上展开内容。循环结果数组,将结尾</p>放回到段落上,对剥离标记的段落进行计数,并将其添加到全局计数中。将全局字数与我们的字位置进行比较。如果它更大,请附加内容并取消设置该单词位置。 Stringify并返回。

function insert_after_words( $content, $words_positions = array(), $content_to_insert = 'Insert Me' ) {

    $total_words_count = 0;

    // Explode content on paragraphs.
    $content_exploded = explode( '</p>', $content );

    foreach ( $content_exploded as $key => $content ) {
        // Put the paragraph tags back.
        $content_exploded[ $key ] .= '</p>';

        $total_words_count += str_word_count( strip_tags( $content_exploded[ $key ] ) );

        // Check the total word count against the word positoning.
        foreach ( $words_positions as $words_key => $words_count ) {
            if ( $total_words_count >= $words_count ) {
                $content_exploded[ $key ] .= PHP_EOL . $content_to_insert;
                unset( $words_positions[ $words_key ] );
            }
        }
    }

    // Stringify content.
    return implode( '', $content_exploded );
}