2

I've been using the following functions (updating IDs manually) to group parent & child pages into an array, which I then use in an if/else statement to present content depending on whether or not the current page is in that array. Examples below:

function id_array_function() {
    $array = array(
    10, // Example Parent ID
    12, // Example Child ID
    14  // Example Child ID
  );
    return $array;
}
function content_placement_function() {
    if( is_page( id_array_example() ) ) {
    // If current page is in array, do this
    }
    else {
    // Otherwise, do this
    }
}

Ideally, I'd like to create a reusable function which I can plug any page name into (avoiding IDs due to issues with local/production installs having different page IDs), and return an array of both the parent and any child page names for use elsewhere, such as:

if( is_page( id_array_function('About') ) ) { 
  // Function would return array as ('About', 'Our Company', 'Careers', 'etc...')
  // If current page is in array, do this
}

I've attempted this with wp_list_pages (could not return, only echo), and get_posts/get_terms (both returned empty arrays). If anyone has a pre-existing snippet or an idea as to how I could achieve the reusable function, I'd be massively appreciative of the help.

==========

EDIT: Working answer from Krzysiek below. Possible alternative option on CSS Tricks (targeting IDs): https://css-tricks.com/snippets/wordpress/if-page-is-parent-or-child/

1 Answer 1

1

OK, so what we want to achieve is to write a function that will take a title of a page and return the array containing its ID and IDs of its children. So here's the code:

function get_page_and_its_children_ids_by_title( $page_title ) {
    $result = array();

    $page = get_page_by_title( $page_title );  // find page with given title
    if ( $page ) {  // if that page exists
        $result[] = $page->ID;  // add its ID to the result
        $children = get_children( array(  // get its children 
            'post_parent' => $page->ID,
            'post_type'   => 'page', 
            'numberposts' => -1,
            'post_status' => 'publish' 
        ) );
        $result = array_merge( $result, array_keys( $children ) );  // add children ids to the result
    }

    return $result;
}
5
  • Thanks Krzysiek. I may have misunderstood the usage, but I've updated the if/else in the content placement function as follows: ``` if( is_page( get_page_and_its_children_ids_by_title( 'About' ) ) ) { // Do this } ``` I'm still not seeing content across the parent/children in that array - how would you use the array the function has generated? Commented Mar 27, 2019 at 17:48
  • Yes, something like this. Do you have any problems using it? Commented Mar 27, 2019 at 17:49
  • Yeah, I'm not seeing the content - should '$title' and '$page_title' be separate entities, or should they be the same variable? Commented Mar 27, 2019 at 17:51
  • Ahhh... Sorry for that - simple typo - it happens when you type code on mobile ;) Yeah, they definitely should be the same - already fixed that in my answer. Commented Mar 27, 2019 at 17:53
  • Yeah, that's perfect. Thanks Krzysiek - massively appreciated. Will accept as answer now and update original post. Commented Mar 27, 2019 at 17:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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