处理前修改WP_POST

时间:2015-10-18 作者:maltaannon

我正在寻找一种方法来修改WP_Post 对象,然后将其处理并显示在页面上。

Reason - 我在WP还在2.0版甚至更早的时候建立了我的网站。我有好几年没有关注它了,但现在我又回来更新了。我的网站的第一个版本是用my-hacks.php 以及add_filter(\'the_content\', some_function); 好消息是它们仍然可以工作,但我在添加一些功能时遇到了困难。

tl;dr -我的帖子没有“特色图片”(或摘录),但由于我构建网站的方式,我知道图片在哪里,并且我可以为每个帖子动态生成URL(摘录也是如此);我不想把他们添加到帖子中。我希望在主题显示和处理查询之前,将它们添加到查询结果中,以便主题提供的所有好东西都“认为”数据实际存在。

What I already did -我试过了add_actionadd_filter\'the_post\'\'the_content\', 我也试过add_post_meta (这似乎是一个很好的方式),但我不能让它工作。

What I think is a good way to go -只需添加add_filter(\'the_content\') 不会的,因为现在大多数模板都会检查帖子中的元数据,比如缩略图/特色图片或摘录,所以在帖子中添加一些内容并不能解决问题。这就是为什么我认为最好在模板处理所有post数据之前对其进行处理。这似乎是一个使用钩子的好地方,但哪一个,以及我如何使用它?

What I\'d appreciate -这是一个简单的例子,可以在循环和单篇文章中使用,并通过修改the_post 数据而不是使用the_title(). 如果有一个例子,我会非常感激,在这个例子中,一张特色图片被放在没有(可以是静态URL)和摘录(可以是静态文本)的帖子中。

To clarify -我不希望这在数据库中进行更改,只希望查询返回的结果,以便它似乎从一开始就在数据库中。这一切都应通过以下方式实现functions.php, 或其他包装(添加require_once("my_functions.php")functions.php 主题)。

tfl;dfr -如何更改WP_Post 对象(内容、元、缩略图、自定义字段…),在循环内外通过修改查询结果,使模板/主题“认为”更改已经存在,并且可以按预期处理它们?应使用外部文件(不更改模板本身),如functions.php.

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

感谢s\\u ha\\u dum为我指出了正确的方向。以下是我发布的问题的完整答案。

要将摘录插入帖子,请执行以下操作:

// function called by the_post filter (by reference) 
// needs no return statement. changes WP_Post object
function _inject_excerpt($post)
{
    // do whatever you like here. I needed to treat the content of the post
    // before the <!--more--> tag as excerpt

    // extract the text before the <!--more--> tag to be treated as excerpt
    $post->post_excerpt = preg_split(\'/<!--more(.*?)?-->/\', $post->post_content)[0]; 
}
add_filter(\'the_post\', \'_inject_excerpt\');
要将功能图像注入到帖子,请执行以下操作:

// function called by a post_thumbnail_html filter 
// injects post thumbnail / feature image into the post
// when there is none before processing so the template can see it
function _inject_thumbnail( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    if (empty($html)) {
        $url = "preview.jpg"; // some processing might be needed to find the right url
        $html = "<img src=\'$url\'>"; // some additional styling might be needed
    }
    return $html;
}
add_filter( \'post_thumbnail_html\', \'_inject_thumbnail\');
希望这能帮助其他需要帮助的人。

SO网友:s_ha_dum

有一个the_post hook 可以修改post对象:

function my_the_post_action( $post_object ) {
    // modify post object here
}
add_action( \'the_post\', \'my_the_post_action\' );
但是post数据不是缩略图的存储位置。它们通过后元字段关联。这就是你必须操纵的。类似于:

function my_thumbs($n, $object_id, $meta_key, $single ) {
  if (\'_thumbnail_id\' == $meta_key) {
    echo \'image link\';
  }
}
add_filter( "get_post_metadata", \'my_thumbs\', 10, 4 );
虽然我不知道这个函数需要多复杂。

老实说,如果您正在运行WP 2,那么您需要更新一些东西,并花时间将您的临时系统转换为核心功能。真诚地

相关推荐

Even/Odd every two posts

我需要每两篇文章显示一个不同的布局,是否可以使用偶数/奇数来实现这一点?<?php while (have_posts()): the_post() ?> <?php if ($wp_query->current_post % 2 == 0): ?> even <?php else: ?> odd <?php endif ?> <?php endwhile