Site logo

Archived topic

CC Child Pages: list only ACF "logo" image field

9 replies · Started by Tim on April 19, 2020

Viewing posts 1–10 of 10

Hello

Previously I have simply used CC Child Pages plugin shortcode to list Title, Featured Image etc.

Now I would like to list only an ACF "logo" image field that I have for each "client" Child of an array of Parent Pages. These I intend to display in the Client and Partner sections of the home page.

I have displayed ACF fields in WP Show Posts in Element custom hooks like wpsp_after_title, but I'm not sure if I can do the same with CC Child Pages, at least I don't find such hooks documented.

Otherwise, is there a less convoluted way to get and display this list of images ?

Hi there,

for the CC Child Pages you would need to ask the plugin author support about their hooks.

But you would probably be better off asking ACF support or searching there forums and skipping CC Child Pages for that need

Yes, ACF probably will be the better way to go.

I suppose I'm asking how I can display a list of an image field eg “logo” that belong to Child Pages of a Page Parent array.

And if I can do that, I would be able to replace all use of CC Child Pages plugin.

Hi David

Thank you for the pointer.

Whilst the topic is very close to mine, the additional complexity of the OP's additional requirements is overwhelming my comprehension of the code. I think I need a simpler example.

I did find another example here:
https://support.advancedcustomfields.com/forums/topic/list-items-and-their-acfields-from-child-pages-on-parent-page/

<?php
	$mypages = get_pages( array( 'child_of' => $post->ID, 'sort_column' => 'post_date', 'sort_order' => 'desc' ) );

	foreach( $mypages as $page ) {		
		$content = $page->post_content;
		if ( ! $content ) // Check for empty page
			continue;

		$content = apply_filters( 'the_content', $content );
	?>
		<?php echo $page->post_title; ?><br>
	<?php
	}	
?>

At this point I'm just trying to get a list of the children of the page that the code is run on, using an Element hooked "after_main_content", with Display Location on one of my parent pages, but I'm getting what appears to be a list of top level and 2nd level pages. I also get the errors:

Notice: Undefined variable: post in /home/resolv6/dev.resolve.mg/wp-content/plugins/gp-premium/elements/class-hooks.php(180) : eval()'d code on line 2

Notice: Trying to get property 'ID' of non-object in /home/resolv6/dev.resolve.mg/wp-content/plugins/gp-premium/elements/class-hooks.php(180) : eval()'d code on line 2

I also found another example here:
https://support.advancedcustomfields.com/forums/topic/show-child-fields-on-parent-page/

The furthest I managed to get with that was:

<?php $pages = array('child_of' => $post->ID, 'parent' => $post->ID );
$packages = get_pages($pages);
foreach ($packages as $package){ 

echo '=========' . $package->post_title . '==============';
?>

<?php the_field('title', $package->ID); ?>
					
<?php
}
?>

But it seems that <?php the_field('title', $package->ID); ?> doesn't display anything and 'child_of' => $post->ID, 'parent' => $post->ID only displays top level pages and 'child_of' => $post->ID alone displays all pages.

I also get these errors:

Notice: Undefined variable: post in /home/resolv6/dev.resolve.mg/wp-content/plugins/gp-premium/elements/class-hooks.php(180) : eval()'d code on line 1

Notice: Trying to get property 'ID' of non-object in /home/resolv6/dev.resolve.mg/wp-content/plugins/gp-premium/elements/class-hooks.php(180) : eval()'d code on line 1

I also found this example:

<?php

$args = array(
    'post_type'      => 'page',
    'posts_per_page' => -1,
    'post_parent'    => $post->ID,
    'order'          => 'ASC',
    'orderby'        => 'menu_order'
 );

$mypages = new WP_Query( $args );

if ( $mypages->have_posts() ) : ?>

    <?php while ( $mypages->have_posts() ) : $mypages->the_post(); ?>

        <p style="color: white; text-transform: uppercase;"><?php the_title(); ?></p>

    <?php endwhile; ?>

<?php endif; wp_reset_query(); ?>

And got those same errors for line 6, which leads me to believe there is something amiss with $post->ID So do I have to define this somewhere ? I thought $post was already part of wp.

You need to set the $post variable in your code. For example:

<?php
        global $post;

	$mypages = get_pages( array( 'child_of' => $post->ID, 'sort_column' => 'post_date', 'sort_order' => 'desc' ) );

	foreach( $mypages as $page ) {		
		$content = $page->post_content;
		if ( ! $content ) // Check for empty page
			continue;

		$content = apply_filters( 'the_content', $content );
	?>
		<?php echo $page->post_title; ?><br>
	<?php
	}	
?>

Hi Tom

Thank you for that. No more errors.

However, I did need to remove

if ( ! $content )
 continue;

for the content to be displayed.

I can now display the intended content from children of 1 parent.

However, my intention is to display content from children of multiple parents.

It seems that child_of expects an integer, so whilst 'child_of' => 1291, is acceptable 'child_of' => (1291, 1326), is not.

I then found this unaccepted answer: https://stackoverflow.com/a/32535618

Which provides an alternative method but still using child_of.

I have now managed to display the intended ACF content from children of multiple parent IDs.

<div class="grid">
<?php
  global $post;
  $mypages = array();

  foreach (array(1291,1326,1275,1301,1261,1247,1322) as $pages) {
    $mypages = array_merge($mypages, get_pages(array('child_of' => $pages, 'sort_column' => 'post_date', 'sort_order' => 'desc' )));
	};
  foreach( $mypages as $pages ) {
   $content = $pages->post_content;
   $content = apply_filters( 'the_content', $content   );									
?>

<div class="entry-content" itemprop="text">
	<div class="client-logo-header">
		<figure class="client-logo-media">
			<?php
				$logo = get_field('logo', $pages->ID);
				$size = 'medium'; // (thumbnail, medium, large, full or custom size)
				$client_link = esc_url( get_permalink($pages->ID) );
				if( $logo ) {
					echo '<a href="' . $client_link .'">' . wp_get_attachment_image( $logo, $size ) . '</a>';
				}
			?>
		</figure>
	</div>
</div>
<?php
}
?>
</div>

However, the child pages that do not have the required logo render empty elements. How can I filter out those with the missing content ?

Try:

<div class="grid">
<?php
global $post;
$mypages = array();
foreach (array(1291,1326,1275,1301,1261,1247,1322) as $pages) {
    $mypages = array_merge($mypages, get_pages(array('child_of' => $pages, 'sort_column' => 'post_date', 'sort_order' => 'desc' )));
};
foreach( $mypages as $pages ) {
    $content = $pages->post_content;
    $content = apply_filters( 'the_content', $content   );
    
    // Get logo fields
    $logo = get_field('logo', $pages->ID);
    $size = 'medium'; // (thumbnail, medium, large, full or custom size)
    $client_link = esc_url( get_permalink($pages->ID) );

    // If Logo then Display it
    if( $logo ) {
    ?>
        <div class="entry-content" itemprop="text">
            <div class="client-logo-header">
                <figure class="client-logo-media">
			        <?php echo '<a href="' . $client_link .'">' . wp_get_attachment_image( $logo, $size ) . '</a>';?>
		        </figure>
	        </div>
        </div>
    <?php
    }
?>
</div>

Thank you David and for adding the comments :)

It took me a while to figure out where to put the missing brace:


<?php
   }
}
?>

oops - glad you got it working

This archived topic is closed to new replies.