web-dev-qa-db-fra.com

Recherche uniquement les petits enfants, pas les enfants dirige de la page/page actuelle?

Je connais assez bien javascript mais je suis nouveau dans le développement de thèmes php et wordpress. J'ai cherché pas mal de choses et je ne trouve pas de solution à quelque chose qui semble être une tâche assez simple. Tout ce que j'aimerais accomplir, c'est obtenir tous les petits-enfants d'une page, pas les enfants directs, comme suit:

Portfolio

  • enfant 1
    • petit-fils 1A
    • petit-fils 1B
  • enfant 2
    • petit-enfant 2A
    • petit-fils 2B

Ma page est "Portfolio" et j'aimerais "get_pages", mais uniquement ceux qui sont les petits-enfants de "Portfolio". Dans ce cas, elle renverrait uniquement: - "petits-enfants 1A", "petits-enfants 1B", "petits-enfants 2A", "petit-fils 2B".

aucune suggestion?

2

Il n'y a pas de moyen indigène de faire cela autant que je sache. Le moyen le plus simple sera:

  • d'interroger simplement toutes les pages de la hiérarchie de l'ID de page transmis

  • puis retourne tous les ID parents ( propriété $ post_parent de l'objet post ) de toutes les pages d'un tableau

  • parcourez les pages et comparez l'ID de la page avec l'ID du tableau de l'ID parent

  • toute page ayant son identifiant dans le tableau de l'identifiant parent sera simplement ignorée et exclue

  • toute page dont l'ID n'est pas dans le tableau d'ID parent, nous l'utilisons pour construire un nouveau tableau, ces pages seront les pages de niveau le plus bas

Le plus simple sera de créer notre propre fonction personnalisée que nous pourrons appeler dans n’importe quel modèle de page. Voici la fonction:

function get_lowest_level_pages( $page_id = '' )
{
    // Check if we have a page id, if not, return false
    if ( !$page_id )
            return false;

    // Validate the page id
    $page_id = filter_var( $page_id, FILTER_VALIDATE_INT );

    // Check if this is a page, if not, return false
    if ( !is_page() )
        return false;

    // Get all pages in hierarchy of the current page
    $args = [
        'child_of' => $page_id,
    ];
    $q = get_pages( $args );

    // Check if there are pages, if not, return false
    if ( !$q )
        return false;

    // Use wp_list_pluck to get all the post parents from all return pages
    $parents = wp_list_pluck( $q, 'post_parent' );
    // Set the $new__page_array variable that will hold grandchildren/lowest level pages
    $new__page_array = [];

    // Loop through all the pages
    foreach ( $q as $page_object ) {
        // Simply skip any page if it has child page
        if ( in_array( $page_object->ID, $parents ) )
            continue;

        // Create a new array holding only grandchild pages
        $new__page_array[] = $page_object;
    }

    return $new__page_array; 
}

Vous pouvez ensuite l'utiliser comme suit: ( N'oubliez pas de transmettre l'id de la page parent dont vous avez besoin pour obtenir les petits enfants de )

$page_id = get_queried_object_id(); // Returns the current page ID
$q = get_lowest_level_pages( $page_id );

if ( $q ) {
    foreach ( $q as $post ) {
        setup_postdata( $post );

        the_title();

    }
    wp_reset_postdata();
}
2
Pieter Goosen

Utilisez get_page_children

$all_wp_pages = get_all_page_ids();

// Get the page as an Object
$portfolio = get_page_by_title('Portfolio');

// Filter through all pages and find Portfolio's children
$portfolio_children = get_page_children($portfolio->ID, $all_wp_pages);

foreach ($portfolio_children as $child) {

    $post_data = array('child_of' => $child->ID);
    $grandchild = get_pages($post_data);
}

// echo what we get back from WP to the browser
echo '<pre>' . print_r($grandchild, true) . '</pre>';
1
John Priestakos

Ceci pour que vous puissiez avoir une idée, n’avez pas testé ce code mais vous devriez peut-être essayer.

<?php

    $args = array(
    'post_parent' => 0, //post parent id
    'post_type'   => 'any', 
    'numberposts' => -1,
    'post_status' => 'any' 
); 
    $childen = get_children( $args, OBJECT );

    foreach($children as $child){

      $args = array(
    'post_parent' => $child->ID,
    'post_type'   => 'any', 
    'numberposts' => -1,
    'post_status' => 'any' 
); 
      $grand_children[] = get_children($args, OBJECT);
}

peut-être que vous pouvez essayer comme ça.

0
1inMillion