是否可以更改由_Content()生成的HTML的结构?若有,原因为何?如果没有,是否有解决办法?

时间:2018-06-03 作者:agdhruv

假设我的管理仪表板上的编辑器创建以下HTML(当我使用the_content():

<blockquote>Hello this is the best quote in the world!</blockquote>
<blockquote>Hello this is the second best quote in the world!</blockquote>
<blockquote>Hello this is the third best quote in the world!</blockquote>
<h2>This is a heading for a paragraph</h2>
<p>This is some paragraph.</p>
.
.
.
在此基础上,我想将引号组合在一个div 并将页面的其余内容分组到单独的div. 类似这样:

<div class="my-blockquotes">
    <blockquote>Hello this is the best quote in the world!</blockquote>
    <blockquote>Hello this is the second best quote in the world!</blockquote>
    <blockquote>Hello this is the third best quote in the world!</blockquote>
</div>

<div class="main-content">
    <h2>This is a heading for a paragraph</h2>
    <p>This is some paragraph.</p>
    .
    .
    .
</div>
Basically, is there a way to change the structure of the HTML that the_content() generates? 我试着搜索有关walker类的内容,但对于the_content(). 我尝试了一些黑客补丁,比如使用短代码,但没有找到解决方案。

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

您可以使用the_content filter, 将内容过滤到您的结构中。

像这样的事情

<?php
add_filter(\'the_content\',function($the_content){
    // find blockquotes
    $regex = \'/<blockquote>(.+?)<\\/blockquote>([\\n|$])/i\';
    $blockquotes = preg_match_all($regex,$the_content,$matches);

    // remove blockquotes
    $main_content = preg_replace($regex,\'\',$the_content);

    // rebuild blockqoutes
    $my_blockquotes = \'\';
    foreach ($matches[1] as $blockquote) {
        $my_blockquotes .= "<blockquote>{$blockquote}</blockquote>";
    }

    // rebuild content
    $new_content = \'\';
    if (!empty($my_blockquotes)) {
        $new_content = "
        <div class=\'my-blockquotes\'>
            {$my_blockquotes}
        </div>\\n";
    }
    $new_content .= "
    <div class=\'main-content\'>
        {$main_content}
    </div>\\n";

    return $new_content;
});
但您会注意到,当您分离用户提供的内容时,仍然可能会发生意外的用户错误,这可能会让您感觉有点不太正常。例如:块引号之间的换行符可能不一致。

你最好创建a custom metabox 和/或使用post_meta 将这些块引号作为元数据单独存储到帖子中。然后,您可以通过the_content 不过,您也可以编辑主题的模板文件,或挂接到主题中的其他操作。

SO网友:Liam Stewart

我做了类似的事情——在我的情况下,我直接在任何blockquote 使用字符串替换的标记。

<?php
$content = the_content();
$content = str_replace( "<blockquote>", "<blockquote class=\\"quote\\">", $content );
echo $content;
?>
阅读有关字符串替换的更多信息:http://php.net/manual/en/function.str-replace.php

SO网友:Qubical

在我的搜索中得到了这个答案;“重写”;这反过来又让我找到了一个使用php domdocument函数的不同解决方案,我将在下面发布它可能提供的任何帮助。

/**
 * Add tweet link to blockquotes
 */
function my_blockquote_tweets( $the_content ) {

    global $wp;

    // Parse content
    $document = new DOMDocument();
    $document->loadHTML( $the_content );
    $blockquotes = $document->getElementsByTagName(\'blockquote\');

    $svg = file_get_contents( get_stylesheet_directory() . \'/resources/images/svg/social-logos/twitter.svg\' );

    foreach ($blockquotes as $blockquote) {

        // Twitter Icon
        $twitter_svg = $document->createDocumentFragment();
        $twitter_svg->appendXML( $svg );

        // Icon wrapper
        $twitter_logo_wrapper = $document->createElement(\'span\');
        $twitter_logo_wrapper->setAttribute(\'class\', \'tweet-logo\');
        $twitter_logo_wrapper->appendChild( $twitter_svg );

        $tweet_text = substr($blockquote->nodeValue, 0, 250);

        if( strlen( $tweet_text ) > 250 ) {
            $tweet_text .= \' &#8230;\';
        }

        $tweet = $document->createElement(\'a\');
        $tweet->setAttribute( \'class\', \'tweet-this group\' );
        $tweet->setAttribute( \'title\', __(\'Tweet this quote\', \'pwa\') );
        $tweet->setAttribute( \'href\', \'https://twitter.com/intent/tweet?text=\' . urlencode( $tweet_text ) . \'&url=%0A\' . urlencode(home_url( $wp->request )));
        $tweet->setAttribute( \'target\', \'_blank\' );

        $tweet->appendChild( $twitter_logo_wrapper );

        $tweet_text = $document->createTextNode( __( \'Tweet this\' , \'pwa\' ) );
        $tweet->appendChild( $tweet_text );

        $blockquote->appendChild( $tweet );

    }

    $the_content = $document->saveHtml();

    return $the_content;


}
add_filter(\'the_content\', \'my_blockquote_tweets\', 10, 1);
希望它能帮助别人。

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register