Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I have parent posts (custom post type hierarch=true) with ID 1, 2, 3, 4.

The parent posts with ID 2 and 4 have child pages.

I need to retrieve only posts 2 and 4 and all of their child pages.

Something like this

$argsch = array('orderby' => 'date','order' => 'DESC','post_type' => 'products', 'include' => '2, 4');
$childs = get_posts($argsch);

How can I edit this to return child pages of the included id's?

share|improve this question
add comment

3 Answers

up vote 3 down vote accepted

You have two options:

  1. Call get_posts multiple times: one for the parent pages using post__in => array(2,4), and two for the child pages of each parent with post_parent => 2 and post_parent => 4 and finally merge all the results into a single array.

  2. Write directly your SQL query and use $wpdb->get_results. See this article for an example. In your case it would be something similar to the following (not tested) code:

    $query_sql = "
        SELECT *
        FROM $wpdb->posts
        WHERE post_type = 'products'
        AND (ID IN (2,4) OR post_parent IN (2,4))
        ORDER BY post_date DESC
    ";
    $query_result = $wpdb->get_results($query_sql, OBJECT);
    
share|improve this answer
    
the first on is bad, becouse I dont know exact count of Ids there might be. The second on seem good to me. Ill try. –  jam Nov 22 '11 at 11:48
    
This was the greatest! –  jam Nov 22 '11 at 12:08
add comment
$args = array('orderby' => 'date','order' => 'DESC','post_type' => 'products', 'include' => '2, 4');

// get the 2 and 4 posts
$children = get_posts($args);

// get the children of 2, and merge arrays
$children = array_merge($children,get_posts(array('orderby' => 'date','order' => 'DESC','post_type' => 'products','post_parent'=>2)));

// get the children of 4, and merge arrays
$children = array_merge($children,get_posts(array('orderby' => 'date','order' => 'DESC','post_type' => 'products','post_parent'=>4)));

foreach($children as $child){
    // etc
}

Although it would be much much easier/faster if you could tag them in a custom taxonomy or identify them some other way so that you were only needing to look for one thing, rather than 3 things.

e.g. if we had a custom taxonomy 'highlighted_products' we might do:

$children = get_posts('post_type' => 'products', 'orderby' => 'date','order' => 'DESC','highlighted_products' => 'example_page');
foreach($children as $child){
    // etc
}

Which would be far more flexible, less prone to errors ( ID 2 and 4 might change! Don't hardcode ), and it's a lot faster to do, no raw SQL or multiple queries. Not to mention that you now have a nice user friendly UI in the backend where you just tag a products post and it appears in the right place

share|improve this answer
    
Thank you for your contribution! Direct SQL query runs smootly –  jam Nov 22 '11 at 12:09
add comment
$children = get_posts('post_parent=SLUG_OF_PARENT_POST&post_status=publish');
foreach($children as $child)
{
echo '<br/>ID:'.$child->ID;
}

you can use other attributes (i.e. $child->post_content)... if you need to define post_type, then add this argument too : &post_type=POST_TYPE_NAME

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.