【问题标题】:Parsing WordPress post content解析 WordPress 帖子内容
【发布时间】:2013-12-29 00:22:17
【问题描述】:

我有一个奇怪的布局要解决,我不知所措,即使在规划阶段也是如此。本质上,我需要分离出所有不是.gallery 的内容并将其放入<aside />。我最初考虑使用edit_posthook from the Plugin API 的插件,但后来决定反对它,因为此内容更改是特定于布局的,我想维护一个干净的数据库。 所以...

如何通过 WP 的 the_content 解析不是 .gallery 的内容?诚然不是 PHP 人,所以我非常感谢您的帮助!


根据 Michael 在下面的评论 - 这是 WP 的 the_content 类输出的示例:

HTML

<div class="entry-content">
    <div class="gallery">
        <dl class="gallery-item">
            <dt class="gallery-icon portrait">
                <img src="/imagePath/etc.jpg" class="attachment-thumbnail">
            </dt>
        </dl>
        <dl class="gallery-item">
            <dt class="gallery-icon portrait">
                <img src="/imagePath/etc.jpg" class="attachment-thumbnail">
            </dt>
        </dl>
        <dl class="gallery-item">
            <dt class="gallery-icon portrait">
                <img src="/imagePath/etc.jpg" class="attachment-thumbnail">
            </dt>
        </dl>
    </div>
    <p>Curabitur vulputate, ligula lacinia scelerisque tempor, lacus lacus ornare ante, ac egestas est urna sit amet arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed molestie augue sit amet.</p>
    <ul>
        <li>Item A</li>
        <li>Item B</li>
        <li>Item C</li>
    </ul>
</div>

期望的输出

<div class="entry-content">
    <div class="gallery">
        <dl class="gallery-item">
            <dt class="gallery-icon portrait">
                <img src="/imagePath/etc.jpg" class="attachment-thumbnail">
            </dt>
        </dl>
        <dl class="gallery-item">
            <dt class="gallery-icon portrait">
                <img src="/imagePath/etc.jpg" class="attachment-thumbnail">
            </dt>
        </dl>
        <dl class="gallery-item">
            <dt class="gallery-icon portrait">
                <img src="/imagePath/etc.jpg" class="attachment-thumbnail">
            </dt>
        </dl>
    </div>
    <aside>
        <p>Curabitur vulputate, ligula lacinia scelerisque tempor, lacus lacus ornare ante, ac egestas est urna sit amet arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed molestie augue sit amet.</p>
        <ul>
            <li>Item A</li>
            <li>Item B</li>
            <li>Item C</li>
        </ul>
    </aside>
</div>

【问题讨论】:

  • 对于我们这些不熟悉 WP 类和标记布局的人,您能否发布一个示例,说明标记现在的样子,以及您希望它是什么样的?您真的需要更改标记吗?你不能仅通过 CSS 实现你想要的吗?
  • 谢谢迈克尔。我已经包含了上面输出的示例。不幸的是,出于各种原因,我确实需要更改标记。不过我确实希望它是 CSS-able - 绝对是我的强项。
  • 有点粗俗,但你可以在 jQuery/JavaScript 中做到这一点 - 请参阅 stackoverflow.com/questions/15430851/…
  • 是的,用 JavaScript 很容易做到,但不太理想

标签: php html wordpress parsing


【解决方案1】:

您需要为此使用Dom Parser。这是一个示例,说明如何使用标记作为示例进行操作。测试产生了预期的结果,因此希望这将为您提供所需的领先优势:

add_filter( 'the_content', 'wrap_nongallery_aside', 20 );
function wrap_nongallery_aside($content){
    $dom = new DOMDocument();
    $dom->loadHTML($content); // Replace with Edit below if PHP >= 5.4
    $aside = $dom->createElement('aside');
    $xpath = new DOMXPath($dom);
    $not_gallery = $xpath->query('//div[@class="entry-content"]/*[not(contains(@class, "gallery"))]');

    foreach($not_gallery as $ng){
        $aside->appendChild($ng);
    }
    $dom->getElementsByTagName('div')->item(0)->appendChild($aside);
    return $dom->saveHTML();
}

编辑:

如果您使用的是 PHP >= 5.4,那么您可以使用以下命令轻松地从生成的标记中删除任何额外的 &lt;html&gt;&lt;body&gt; 标记:

$dom-&gt;loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

【讨论】:

  • 谢谢你,正是我正在寻找的东西,而且非常清楚地超出了我的理解范围。
  • 值得注意的是,这个方法添加了一个 Doctype String 和 和 标签,你可能不希望这样。
  • @AndreasRiedmüller 您是对的,但是在发布此答案的 8 年中,还提供了关闭该行为的选项。 See this answer 了解更多详情。
【解决方案2】:

Maiorano84 的回答效果很好,但在他回复之前,我想出了一种替代方法,它对我的​​情况不太具体,所以我认为分享一下会很好。

我最初取消了插件方法,因为它需要更改帖子内容本身——不仅仅是输出的格式,而是意识到插件独立于主题安装。下面是一个非常简单的、面向开发人员的插件,它将 [aside /] 短代码转换为 HTML 元素。它完全基于BSD Aside by Sean D Burkin。我最终会为 WP 文本编辑器添加一个按钮并将其开源。

<?php
/*
Plugin Name: RW Content Aside
Description: Inserts aside formatting into post content via shortcodes
Author: Daniel Redwood
Version: 0.1
Author URI: http://www.rdwd.fm/

Based on SBD Aside by Sean B. Durkin:
Original Plugin: http://seanbdurkin.id.au/pascaliburnus2/archives/51
Author: http://www.seanbdurkin.id.au
*/

if ( !is_admin() ){
  add_filter('the_content', 'handle_rw_aside');
}

function generate_random_str( $length=10)
{
  return substr(md5(rand()), 0, $length);
}

function generate_place_marker()
{
  return '@' . generate_random_str( 10) . '@';
}

function GetBody( $aside_instruction) {
  return preg_replace( '~^((<p>)?  \S+\s*=\s*.*?(<br \/>|<\/p>)\n?)*~mi', '', $aside_instruction);
}

function handle_rw_aside($the_content)
{
  $begin = generate_place_marker();
  $end   = generate_place_marker();

  $new_content = preg_replace(
    '~^((<p>)?\[aside\](<br />|</p>))(.*?)(^(<p>)?\[\/aside\](<br />|</p>))~ms',
    $begin . '$4' . $end,
    $the_content);

  $new_content = preg_replace_callback(
    '~^(<p>)?(!+\[\/?aside\])~m',
    function ($match) {
      return $match[1] . substr( $match[2], 1);
      },
    $new_content);

  $pattern = '~'.$begin.'(.*?)'.$end.'~s';

  return preg_replace_callback(
    $pattern,
    function ($match) {
      $aside_instruction = $match[1];
      $body = GetBody( $aside_instruction);
      $aside = '<aside class="contentAside">' . $body . '</aside>';
      return $aside;
      },
    $new_content);

}

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多