web-dev-qa-db-fra.com

get_posts seulement les enfants de certains parents

J'ai des publications parentes (type de publication personnalisé hierarch = true) avec les identifiants 1, 2, 3, 4.

Les publications parent avec les ID 2 et 4 ont des pages enfants.

Je n'ai besoin de récupérer que les articles 2 et 4 et toutes leurs pages enfants.

Quelque chose comme ça

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

Comment puis-je modifier ceci pour renvoyer des pages enfants des identifiants inclus?

1
jam

Vous avez deux options:

  1. Appelez plusieurs fois get_posts: un pour les pages parent utilisant post__in => array(2,4) et deux pour les pages enfants de chaque parent avec post_parent => 2 et post_parent => 4 et enfin fusionner tous les résultats dans un seul tableau.

  2. Écrivez directement votre requête SQL et utilisez $wpdb->get_results. Voir cet article pour un exemple. Dans votre cas, ce serait quelque chose de similaire au code suivant (non testé):

    $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);
    
4
marcochiesi
$children = get_posts('post_parent=SLUG_OF_PARENT_POST&post_status=publish');
foreach($children as $child)
{
echo '<br/>ID:'.$child->ID;
}

vous pouvez utiliser d'autres attributs (c'est-à-dire $child->post_content) ... si vous devez définir post_type, ajoutez également cet argument: &post_type=POST_TYPE_NAME

1
T.Todua
$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
}

Bien que ce serait beaucoup plus facile/rapide si vous pouviez les marquer dans une taxonomie personnalisée ou les identifier d’une autre manière, de sorte que vous n’ayez besoin que de chercher une chose, plutôt que trois.

par exemple. si nous avions une taxonomie personnalisée 'highlight_products', nous pourrions faire:

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

Ce qui serait beaucoup plus flexible, moins sujet aux erreurs (les ID 2 et 4 pourraient changer! Ne pas coder en dur), et c'est beaucoup plus rapide à faire, pas de SQL brut ou de multiples requêtes. Sans compter que vous avez maintenant une interface utilisateur conviviale pour Nice dans le backend où vous venez de marquer une publication de produit et qu'elle apparaît au bon endroit.

1
Tom J Nowell