每500个字符(或任何其他字符计数)将帖子内容划分为单独的div

时间:2013-08-16 作者:user2655393

截取帖子的\\u内容(对于单个帖子页面)并将\\u内容划分为500个字符(或任何其他字符数)的部分,然后输出包装在自己的div容器中的每个500个字符的部分的最佳方法是什么?

我知道get\\u the\\u content()将以字符串形式返回post内容,该字符串可以存储在变量中。但是,作为PHP新手,我不知道如何根据字符数对内容进行分段。我们可以使用以下方法获得字符数:

    <?php
      $content = get_the_content();
      echo strlen($content);
    ?>
但这是我所知的。有人能帮我解决这个挑战吗?

更新:在Lukas Kolletzki对stackoverflow的一些帮助下,我取得了以下进展:

    <?php
    $content = get_the_content();
    $chunks = str_split($content, 500);

    //Printing each chunk in a div
    foreach($chunks as $chunk_content) {
        echo "<div>";
        echo $chunk_content;
        echo "</div>";
    }
    ?>
这成功地将帖子内容拆分为500个单词的部分,并将每个部分包装到单独的容器中。

更进一步,Lukas建议使用wordwrap()和explode()函数来确保单词不会被切成两半:

    <?php
    $content = get_the_content();
    $strings = wordwrap($content, 500, "<br />"); //Put a {BREAK} every 500 characters
    $chunks = explode("<br />", $strings); //Put each segment separated by {BREAK} into an array field

    //Printing each chunk in a div
    foreach($chunks as $chunk_content) {
        echo "<div class="post-content">";
        echo $chunk_content;
        echo "</div>";
    }
    ?>
这很好地工作,但现在我意识到正常的wordpress标记没有被输出。这是因为get\\u the\\u content()只输出文本,而不输出html吗?

我如何才能将这些段落返回到帖子内容中,并仍然保持上述功能?

再次感谢,请不要将此标记为重复。这是一个与摘录长度过滤问题截然不同的问题。。。至少我这么认为。

3 个回复
SO网友:kaiser

get_the_content() 返回编辑器中的内容,但是wpautop 过滤器等连接到the_content (您不需要在分割函数中使用它-只需稍后使用

apply_filters( \'the_content\', $output );
在最后。

你也应该使用strip_shortcodes( get_the_content() ); 拆分前:

$output = get_the_content();
$output = wp_trim_words( $output, 500 );
只要你有内容和array_push() 到您的$output = array();.

SO网友:user2655393

因此,我非常感谢@kaiser和@t31os提供的所有反馈和答案。我对PHP不太了解,所以很难用kasier&;t31os的答案。这是我的错,因为我不是一个很有天赋的程序员:-(

但是,我想发布我通过对PHP进行研究而提出的解决方案。net并就StackOverflow提出了类似的问题。

下面是我用来完成我最初打算做的事情的代码:

    <?php
    $content = get_the_content();
    $strings = wordwrap($content, 500, "<!--break-->"); //insert this every 500 chars, but preserve whole words.
    $chunks = explode("<!--break-->", $strings); create a new string of 500-char sections.

    ob_start(); // buffer the output of the following expressions...
    foreach($chunks as $chunk_content) {
        echo \'<span>\'; // use <span> instead of <div> so as to not interrupt the paragraph formatting of the content when viewed normally (graceful degradation).
        echo $chunk_content;
        echo \'</span> \';
        }
    $segmented_content = ob_get_contents(); // put the results of the above expressions into a variable.
    ob_end_clean(); // discard the expressions that were buffered.
    echo nl2br($segmented_content); // put the result through a filter which replaces line-breaks with <br> tags.
    ?>
备注:

这种内容分段的目的是创建单独的框架或“页面”,供书架页面翻转插件使用(请查看此codrops tutorial 了解更多信息)。每个500个字符的部分将被视为一个“页面”,页面上的导航控件允许用户通过一个漂亮的CSS3 3D转换来翻转页面。

我用过<span> 容器来包装输出,因为此方法有助于进行适当的降级。如果用户的设备不支持Javascript或一些基本的CSS3属性,那么Modernizer将检测到这一点,我的CSS将进行调整,显示正常的内容页面,而不是分为单独的框架,在这种情况下<span> 不会破坏内容的正常段落结构。

我使用输出缓冲将所有500个字符部分编译成一个变量,通过nl2br(); 最终输出的过滤器。

起初我试着用wpautop(); 过滤以确保段落在输出中正确呈现,但很快就会记住<span><p> 标记不能重叠:-P如果我应用wpautop(); 单独过滤到每个500 char部分,它将输出<p> 有时在句子中间加标记。解决方案是使用nl2br(); 筛选以添加<br> 内容中每个换行处的标记,因为它们不需要结束标记,将保持段落结构,而不会中断500个字符容器。

问题:此代码有效,将用于流量不高的网站(每天访问量可能少于50次)。但是,我仍然担心(因为我真的不是很了解PHP),这段代码可能很慢,也不是很优雅。

假设我确切地知道如何实现kaiser和t31os在其答案中建议的目标,那么他们的解决方案在计算速度方面是否会更好(即更少的服务器请求、db查询、更少的代码等)?还是我的解决方案同样好?

SO网友:s_ha_dum

根据用户2655393的请求,我写了a version of his/her code 它不使用输出缓冲,而是使用字符串串联。

$content = get_the_content();
$strings = wordwrap($content, 500, "<!--break-->"); //insert this every 500 chars, but preserve whole words.
$chunks = explode("<!--break-->", $strings); create a new string of 500-char sections.  
$segmented_content = \'\';
foreach($chunks as $chunk_content) {
  $segmented_content .= \'<span>\'; // use <span> instead of <div> so as to not interrupt the paragraph formatting of the content when viewed normally (graceful degradation).
    $segmented_content .= $chunk_content;
  $segmented_content .= \'</span> \';
}
echo nl2br($segmented_content); // put the result through a filter which replaces line-breaks with <br> tags.

结束

相关推荐

Get posts by term slug only

我想做的是构建一个短代码,它将根据传递给它的分类法段塞显示一个帖子列表。但据我所知,你不能只使用一个术语的slug来引入帖子,而不必指定它所属的分类法。有没有可能只使用术语slug而不使用它所在的特定分类法来获取帖子或其他基于分类法的数据(术语meta、名称等)?