Call _get_post_ancestors() from get_post_ancestors() if the ancestors property is not set in the post object. Works around situations where ancestors is not set in the cached version of the post object. see #18536

git-svn-id: http://svn.automattic.com/wordpress/trunk@20171 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
ryan 2012-03-12 18:23:48 +00:00
parent f76fd8e6e6
commit 6241238938
2 changed files with 7 additions and 4 deletions

View File

@ -430,7 +430,10 @@ function &get_post(&$post, $output = OBJECT, $filter = 'raw') {
function get_post_ancestors($post) { function get_post_ancestors($post) {
$post = get_post($post); $post = get_post($post);
if ( !empty($post->ancestors) ) if ( ! isset( $post->ancestors ) )
_get_post_ancestors( $post );
if ( ! empty( $post->ancestors ) )
return $post->ancestors; return $post->ancestors;
return array(); return array();
@ -4645,12 +4648,12 @@ function _get_post_ancestors(&$_post) {
if ( empty($_post->post_parent) || $_post->ID == $_post->post_parent ) if ( empty($_post->post_parent) || $_post->ID == $_post->post_parent )
return; return;
$id = $_post->ancestors[] = $_post->post_parent; $id = $_post->ancestors[] = (int) $_post->post_parent;
while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) { while ( $ancestor = $wpdb->get_var( $wpdb->prepare("SELECT `post_parent` FROM $wpdb->posts WHERE ID = %d LIMIT 1", $id) ) ) {
// Loop detection: If the ancestor has been seen before, break. // Loop detection: If the ancestor has been seen before, break.
if ( ( $ancestor == $_post->ID ) || in_array($ancestor, $_post->ancestors) ) if ( ( $ancestor == $_post->ID ) || in_array($ancestor, $_post->ancestors) )
break; break;
$id = $_post->ancestors[] = $ancestor; $id = $_post->ancestors[] = (int) $ancestor;
} }
} }

View File

@ -2671,7 +2671,7 @@ class WP_Query {
// Check post status to determine if post should be displayed. // Check post status to determine if post should be displayed.
if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) { if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
$status = get_post_status($this->posts[0]); $status = get_post_status($this->posts[0]->ID);
$post_status_obj = get_post_status_object($status); $post_status_obj = get_post_status_object($status);
//$type = get_post_type($this->posts[0]); //$type = get_post_type($this->posts[0]);
if ( !$post_status_obj->public ) { if ( !$post_status_obj->public ) {