get_posts только детей от определенных родителей
3 ответ
- голосов
-
- 2011-11-22
У вас есть два варианта:
-
Вызовget_posts несколько раз: один для родительских страниц с помощью
post__in => array(2,4)
и два для дочерних страниц каждого родителя с помощьюpost_parent => 2
иpost_parent => 4
и,наконец,объединить все результаты в единый массив. -
Напишите свой SQL-запрос напрямую и используйте
$wpdb->get_results
.См. в этой статье для примера.В вашем случае это будет что-то вроде следующего (не протестированного) кода:$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);
You have two options:
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 withpost_parent => 2
andpost_parent => 4
and finally merge all the results into a single array.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);
-
первый - это плохо,потому что я не знаю точное количество идентификаторов,которые там могут быть.Второй вариант мне понравился.Я буду стараться.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.
- 0
- 2011-11-22
- jam
-
- 2011-11-22
$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 }
Хотя было бы намного проще/быстрее,если бы вы могли пометить их в пользовательской таксономии или идентифицировать их каким-либо другим способом,чтобы вам нужно было искать только одну вещь,а не три.
например если бы у нас была настраиваемая таксономия «highlighted_products»,мы могли бы сделать:
$children = get_posts('post_type' => 'products', 'orderby' => 'date','order' => 'DESC','highlighted_products' => 'example_page'); foreach($children as $child){ // etc }
Что было бы гораздо более гибким,менее подверженным ошибкам (ID 2 и 4 могут измениться! Не выполняйте жесткое кодирование),и это намного быстрее,без сырого SQL или множественных запросов. Не говоря уже о том,что теперь у вас есть приятный удобный пользовательский интерфейс в бэкэнде,где вы просто помечаете сообщение о продукте,и оно появляется в нужном месте
$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
-
- 2013-11-13
$children = get_posts('post_parent=SLUG_OF_PARENT_POST&post_status=publish'); foreach($children as $child) { echo '<br/>ID:'.$child->ID; }
вы можете использовать другие атрибуты (например,
$child->post_content
) ... если вам нужно определитьpost_type,добавьте также этот аргумент:&post_type=POST_TYPE_NAME
$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
У меня есть родительские сообщения (иерархия пользовательских типов сообщений=true) с идентификаторами 1,2,3,4.
У родительских сообщений с ID 2 и 4 есть дочерние страницы.
Мне нужно получить только сообщения 2 и 4 и все их дочерние страницы.
Примерно так
Как я могу отредактировать это,чтобы вернуть дочерние страницы включенных идентификаторов?