我正在寻找一种方法,可以在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个广告。
任何帮助都是预先准备好的
答案 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 );
}