试着计算一篇博客文章中的段落总数

时间:2016-08-27 作者:iSaumya

我试图计算每个博客帖子中的段落总数,但没有执行,因此没有返回任何内容。

How do you want to use this code?

当前在我的function.php 我使用以下代码在帖子中显示广告:

add_filter( \'the_content\', \'_some_func\' );

function _some_func( $content ) {

    $ad_code = "the ad code";

    if ( is_singular( \'post\' ) ) {
        return prefix_insert_after_paragraph( $ad_code, 12, $content );
    }

    return $content;
}

// Parent Function that makes the magic happen
function prefix_insert_after_paragraph( $insertion, $paragraph_id, $content ) {
    $closing_p = \'</p>\';
    $paragraphs = explode( $closing_p, $content );
    foreach ($paragraphs as $index => $paragraph) {

        if ( trim( $paragraph ) ) {
            $paragraphs[$index] .= $closing_p;
        }

        if ( $paragraph_id == $index + 1 ) {
            $paragraphs[$index] .= $insertion;
        }
    }

    return implode( \'\', $paragraphs );
}
现在,我想通过基于现在有许多段落的代码服务将其提升到下一个级别,如下所示:

add_filter( \'the_content\', \'_some_func\' );

function _some_func( $content ) {

    if( __check_paragraph_count_blog() > 15 )
        $ad_code = "the ad code";

    if ( is_singular( \'post\' ) ) {
        return prefix_insert_after_paragraph( $ad_code, 12, $content );
    }

    return $content;
}
所以,我试着写以下内容__check_paragraph_count_blog() 函数获取总段落数,以便我可以在上面的调用中使用它。

function __check_paragraph_count_blog() {
    global $post;
    if ( is_singular( \'post\' ) ) {
        $count = substr_count( $post->post_content, \'</p>\' );
        return $count;
    } else {
        return 0;
    }
}
我的__check_paragraph_count_blog() 功能:

它总是返回0,它认为</p> 内部标签<code><pre> 标签也是__check_paragraph_count_blog() 功能,使其正常工作,这将是一个非常大的帮助。

3 个回复
最合适的回答,由SO网友:C C 整理而成

我很确定is_singular() 当您在WP循环内时,将返回false,因为有多个帖子被循环通过。尝试is_single() 或者只需查看post对象并检查post_type 属性

add_filter( \'the_content\', \'_some_func\', 15 );

function _some_func( $content ) {

    if( __check_paragraph_count_blog( $content ) > 15 )
        $ad_code = "the ad code";
    else
        $ad_code = \'\';

    return prefix_insert_after_paragraph( $ad_code, 12, $content );

}


function __check_paragraph_count_blog( $content ) {
    global $post;
    if ( $post->post_type == \'post\' ) {
        $count = substr_count( $content, \'</p>\' );
        return $count;
    } else {
        return 0;
    }
}

SO网友:Mark Kaplun

您首先需要定义什么是段落,是在编辑器中看到的段落,还是在html页面上看到的段落。这种区别是至关重要的,因为wordpress在DB中存储内容的方式和将内容“发送”到html的方式存在差异(显然,在考虑短代码、oEmbed和其他操作方面也存在差异)。

在DB中,wordpressdo not 将内容存储为真正的HTML。段落由新行字符分隔,而不是由P标记分隔。过滤器正在运行wpautop 负责将新行转换为P元素。如果您想确保您使用的是HTML版本的内容,那么应该为挂钩使用11或更高的优先级。

代码的另一个问题是,不应在wp_loaded hook,对于特定情况也有一些例外,但即使这样,您也不应该在代码中的一些随机位置添加过滤器。

最后也是最重要的一点,如果要正确解析html,应该使用html解析器,而不是字符串比较,也不要使用regexp。您可能会发现,在客户端实际使用JS比在服务器端处理格式错误的HTML更容易。

SO网友:cjbj

如果你把一个magic function 在里面functions.php 当主题初始化时,将立即对其进行评估(PHP和OOP方面的高手应该能够解释这是如何发生的,但我假设您正在定义一个类)。

在WP确定要显示哪个帖子之前,这个评估已经很久了。因此,没有帖子,没有段落,计数为零。

如何解决这一问题取决于您想做什么。目前您正在写入浏览器控制台,因此any hook 邮件加载后就可以了。像这样:

add_action (\'wp\', \'wpse237301_check_paragraph_count_blog\');