0

我是 SQL 和 $wpdb 的新手,所以请多多包涵。

我正在开发一个旧的 WordPress 博客,其中的帖子可以追溯到 2002 年。几年前它从另一个 CMS 迁移到了 WordPress。

在过去的十年中,帖子标题、日期、作者信息,有时还有其他数据(例如问题编号)被手动添加到每个帖子的顶部。此信息现在在较新的帖子中动态填充,但仍存在于旧帖子的内容中。

我想要做的是向网站添加标签。大多数帖子都被标记了,但标记功能从未被实时推送。

标签工作正常,但在每个标签存档页面上,我想显示实际内容的前几段。换句话说,我希望它排除手动输入的元数据的前 X 段。

该手动发布信息并不总是遵循可预测的模式,但它似乎总是包含发布信息最后一行的日期。

因此,在帖子的实际内容中,它可能如下所示:

<h1>[Post Title]</h1>
<p>By [Author], [Title]<br />
[Month] [Day], [Year]</p>

[ACTUAL POST CONTENT]

或者它可能看起来像这样:

<p class="post_title">[Post Title]</p>
<br><br>
By [Author], [Title]<br>
[Month] [Day], [Year]; Issue #[issue]

[ACTUAL POST CONTENT]

所以帖子开始之前的实际行数是可变的,但最后一行的日期是不变的。

我想知道是否有任何方法可以运行查询(在循环内),在 post_content 中搜索“年份”(2002-2012)并显示包含年份的行之后的三个段落。

谢谢你的帮助。我希望我的连续句子不是太,嗯,连续。

4

1 回答 1

1

试试这个(将其粘贴到模板文件夹中的 functions.php 文件中),正如您所说的 2002 年和 2012 年之间的 4 位数年份之后的前三段,所以它会过滤内容并找到年份(2002、2003 ... 2012)并将返回前三个段落(包含在<p>标签中的文本)

add_filter('the_content', 'filter_year');
function filter_year($content)
{
    $text=$content;
    preg_match('/(20)(\d{2})/', $text, $matches);
    if($matches && ($matches[0] >= 2002 && $matches[0] <= 2012))
    {
        $matches_splited=preg_split('/20[0-9]{2}/', $text);
        preg_match_all('/<p.*?\>(.*?)<\/p>/si', $matches_splited[1], $paras);
        if($paras)
        {
            $c=0;
            foreach($paras[0] as $p)
            {
                if($c <= 2) $new_content.=$p;
                $c++;
            }
            return $new_content;
        }   
    }
    return $content;
}

从以下内容

开始测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试 2010 <p>First Paragraph</p><p>Second Paragraph</p><p>Third Paragraph</p><p>Fourth Paragraph</p><p>Fifth Paragraph</p>

你会得到

<p>First Paragraph</p>
<p>Second Paragraph</p>
<p>Third Paragraph</p>

这会回响

First Paragraph
Second Paragraph
Third Paragraph
于 2012-07-10T19:04:38.473 回答