我在我的主题中有一个自定义页面,我从不同的数据库表创建一个帖子,然后我想在wordpress中显示这个显示,好像它是一个普通的帖子。它似乎在大部分时间都有效,但随机看来,在我调用get_header()之后修改了帖子,我无法理解为什么。
我在apache中设置了一个mod重写规则来点击一个php文件,在这里我得到了我需要的数据并构建了php对象。我使用这个函数填充wordpress post对象。
function BuildSimplePost($title, $body)
{
require_once( SITEROOT . '/wp-load.php' );
@$post = new WP_Post();
@$post->ID = -1;
$post->post_parent = 0;
$post->post_title = $title;
$post->post_name = "simple-response";
$post->post_excerpt = substr($body, 0, 100);
$post->comment_status = "closed";
$post->ping_status = "closed";
$post->post_type = "page";
$post->post_content = $body;
return $post;
}
一旦帖子被排序,我就把这篇文章推到wordpress查询对象中,然后让主题完成其余的工作。
$posts = array($post);
$wp_query->posts = $posts;
$wp_query->post_count = count($posts);
$wp_query->found_posts = count($posts);
$wp_query->max_num_pages = 1;
$wp_query->post = $post;
$wp_query->is_404 = 0;
$wp_query->is_singular = 1;
$wp_query->is_single = 1;
$wp_query->page_id = $post->ID;
include get_template_directory()."/external-page.php";
在external-page.php
内,没有什么奇怪的。它实际上是single.php的副本,删除了一些html。我遇到的问题是,当在此文件中调用get_header();
时,帖子会更改为其他内容。然后,这会触发重定向,将用户带到该网站上属于wordpress的不同页面。
任何人都知道为什么get_header方法会导致像这样的重定向?
答案 0 :(得分:1)
很难准确地说出你的帖子有什么变化。我看到它的方式,你有两个选择:
将帖子对象的副本留在某处,并在更改后的任何内容后立即将其放回原处。您可以创建一个新的全局:
global $mypost;
$mypost = BuildSimplePost(...);
如果您知道$title
和$body
参数,则可以在每次需要时再次调用您的函数。您还可以使用短暂,update_option
/ get_option
来电,或其他几项内容。
有几个可以成为杯子的过滤器:
the_post
操作应更改$post
。这是它真正做的一件事。您可能希望像这样坐在挂钩堆栈的顶部:add_filter('the_post', function() { global $post, $mypost; $post = $mypost; }, 10000);
wp
对象设置之前,有几个动作,你很可能会更改$post
,因为它之前是免费游戏。您可能有插件或主题挂钩:parse_request
,parse_query
,pre_get_posts
或posts_selection
。您可以为每个过滤器尝试类似add_filter('parse_request', function() { global $post; $post = $mypost; }, 10000);
的内容。$post
期间添加了更改template_redirect
全局(以及他们可能不应该更改的其他内容)的内容{{1} },get_header
和loop_start
。哎呀,我自己做过几次。你可以尝试使用这些过滤器做同样的事情,尽管我认为它们不那么可疑。如果这还没有收回您的内容,您可以尝试一些非常脏的内容,例如在调用after query
之前强行插入内容。对此没有任何吸引力,但如果你控制主题很容易。
我知道您认为您的帖子非常复杂,但我会在WP代码中深入研究这几年:打破WP帖子模型是令人心痛的一个方法。如果您没有使用帖子,并且您没有按照他们的意图使用,那么您可能不应该使用WP。还有其他框架可以提供诸如用户身份验证,主题,数据库持久性,事件,REST等功能,而无需WP的开销。
话虽如此,我过去曾使用WP,因为这是我无法控制的要求的一部分。当我的帖子变得太复杂时,我创建了一个包装器对象,如下所示:
the_post
无论您的帖子多么复杂,您都可以使用一个包装器轻松管理其生命周期及其所有跟踪。
然后你不必担心谁会吃你的帖子。如果是,他们可能应该是。