我正在寻找一种方法来修改WP_Post
对象,然后将其处理并显示在页面上。
Reason - 我在WP还在2.0版甚至更早的时候建立了我的网站。我有好几年没有关注它了,但现在我又回来更新了。我的网站的第一个版本是用my-hacks.php
以及add_filter(\'the_content\', some_function);
好消息是它们仍然可以工作,但我在添加一些功能时遇到了困难。
tl;dr -我的帖子没有“特色图片”(或摘录),但由于我构建网站的方式,我知道图片在哪里,并且我可以为每个帖子动态生成URL(摘录也是如此);我不想把他们添加到帖子中。我希望在主题显示和处理查询之前,将它们添加到查询结果中,以便主题提供的所有好东西都“认为”数据实际存在。
What I already did -我试过了add_action
和add_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
.
最合适的回答,由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,那么您需要更新一些东西,并花时间将您的临时系统转换为核心功能。真诚地