WordPress.org

Ready to get started?Download WordPress

Forums

How to know if the post has attachment (13 posts)

  1. mamouneyya
    Member
    Posted 3 years ago #

    Hi

    In the site I am currently building, I want to show the post gallery just if it exists. Otherwise, I want to show something like 'Sorry, no photos for this item.'

    Is there a function that returns TRUE if the post has any attachment, so I can write something like:
    if( has_attachment( $post_id ) ) {
    echo do_shortcode('[gallery columns="3"]');
    } else {
    _e('Sorry, no photos for this item.');
    }
    I didn't find such a one in the function reference. If there isn't, how can I accomplish that using WP functions?

    Thanks!

  2. popper
    Member
    Posted 3 years ago #

    I don't think there's a function for that, but you could probably use something like this

    $args = array(
    	'post_type' => 'attachment',
    	'numberposts' => null,
    	'post_status' => null,
    	'post_parent' => $post_id
    );
    $attachments = get_posts($args);
    if ($attachments) {
    	...
    	}
    }

    you could turn that into a little function and place it in the functions.php of your theme.

  3. mamouneyya
    Member
    Posted 3 years ago #

    OK. I've added the function to functions.php:

    /*  Show the post gallery just if it exists  */
    function school_gallery( $post_id ) {
    	$args = array(
    		'post_type' => 'attachment',
    		'numberposts' => null,
    		'post_status' => null,
    		'post_parent' => $post_id
    	);
    
    	$attachments = get_posts( $args );
    	if ( $attachments )
    		echo do_shortcode( '[gallery columns="3"]' );
    	else
    		echo '<p>' . __( 'Sorry, no photos for this item.' ) . '</p>';
    
    	return;
    }

    and I called it inside the loop in the template file:

    <div id="fkp_school_gallery">
    	<h2><?php _e( 'Gallery' ) ?></h2>
    	<?php school_gallery( $post->ID ); ?>
    </div>

    However, $post->ID doesn't seem to work, since the function works correctly when I hardcode a specific post id. Shouldn't be work inside the loop?

  4. popper
    Member
    Posted 3 years ago #

    That's weird. I just tried it, and it works fine for me. Could I see your loop?

  5. mamouneyya
    Member
    Posted 3 years ago #

    <div id="container">
    			<div id="content" role="main">
    
    <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
    
    				<div class="fkp_top">
    					<div id="nav-above" class="navigation">
    						<div class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">' . _x( '←', 'Previous post link', 'twentyten' ) . '</span> %title' ); ?></div>
    						<div class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '→', 'Next post link', 'twentyten' ) . '</span>' ); ?></div>
    					</div><!-- #nav-above -->
    
    					<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    						<h1 class="entry-title"><?php the_title(); ?></h1>
    
    						<div class="entry-meta">
    							<?php fkp_posted_on(); ?>
    						</div><!-- .entry-meta -->
    
    						<div class="entry-content">
    							<?php the_content(); ?>
    							<?php wp_link_pages( array( 'before' => '<div class="page-link">' . __( 'Pages:', 'twentyten' ), 'after' => '</div>' ) ); ?>
    						</div><!-- .entry-content -->
    
    <?php if ( get_the_author_meta( 'description' ) ) : // If a user has filled out their description, show a bio on their entries  ?>
    						<div id="entry-author-info">
    							<div id="author-avatar">
    								<?php echo get_avatar( get_the_author_meta( 'user_email' ), apply_filters( 'twentyten_author_bio_avatar_size', 60 ) ); ?>
    							</div><!-- #author-avatar -->
    							<div id="author-description">
    								<h2><?php printf( esc_attr__( 'About %s', 'twentyten' ), get_the_author() ); ?></h2>
    								<?php the_author_meta( 'description' ); ?>
    								<div id="author-link">
    									<a href="<?php echo get_author_posts_url( get_the_author_meta( 'ID' ) ); ?>">
    										<?php printf( __( 'View all posts by %s <span class="meta-nav">→</span>', 'twentyten' ), get_the_author() ); ?>
    									</a>
    								</div><!-- #author-link	-->
    							</div><!-- #author-description -->
    						</div><!-- #entry-author-info -->
    <?php endif; ?>
    
    						<div class="entry-utility">
    							<!--?php twentyten_posted_in(); ?-->
    							<?php edit_post_link( __( 'Edit', 'twentyten' ), '<span class="edit-link">', '</span>' ); ?>
    						</div><!-- .entry-utility -->
    					</div><!-- #post-## -->
    				</div><!-- .fkp_top -->
    
    				<div class="fkp_bottom">
    					<div id="fkp_school_gallery">
    						<h2><?php _e( 'Gallery' ) ?></h2>
    							<?php school_gallery( $post->ID ); ?>
    					</div>
    
    					<div id="nav-below" class="navigation">
    						<div class="nav-previous"><?php previous_post_link( '%link', '<span class="meta-nav">' . _x( '←', 'Previous post link', 'twentyten' ) . '</span> %title' ); ?></div>
    						<div class="nav-next"><?php next_post_link( '%link', '%title <span class="meta-nav">' . _x( '→', 'Next post link', 'twentyten' ) . '</span>' ); ?></div>
    					</div><!-- #nav-below -->
    
    					<?php comments_template( '', true ); ?>
    				</div><!-- .fkp_bottom -->
    
    <?php endwhile; // end of the loop. ?>
    
    			</div><!-- #content -->
    		</div><!-- #container -->
  6. mamouneyya
    Member
    Posted 3 years ago #

    Ah, just got it!
    The code was showing the gallery if it exists but not the error message if no. The problem is that the only post in my WP that has no images, has in fact some other non-images attachments (KML files), so $attachments is also true in its case.

    Is it possible to do something like:

    $attachments = get_posts( $args );
    	if ( $attachments and wp_attachment_is_image( $post_id ) )
    		...

    ..? It doesn't work for me.

  7. popper
    Member
    Posted 3 years ago #

    You could, but you'd have to chek for each attachement, til at least one returns true: http://codex.wordpress.org/Function_Reference/get_post_mime_type

    another way of doing this, I don't know if it is what you need, is check if the post has images, not attachments:

    <?php
    $content = $post->post_content;
    $searchimages = '~<img [^>]* />~';
    
    /*Run preg_match_all to grab all the images and save the results in $pics*/
    
    preg_match_all( $searchimages, $content, $pics );
    
    // Check to see if we have at least 1 image
    $iNumberOfPics = count($pics[0]);
    
    if ( $iNumberOfPics > 0 ) {
         // Your post have one or more images.
    }
    
    ?>
  8. mamouneyya
    Member
    Posted 3 years ago #

    Nope, this won't work. The images are attached to the posts, not inserted inline.

    I couldn't know how can I go through each attachment of a post, could you please direct me with this?

    Thanks, Julia!

  9. popper
    Member
    Posted 3 years ago #

    foreach ($attachments as $a) {
    		if (in_array(get_post_mime_type($a->ID), $images)) {
    			$found = true;
    			break;
    		}
    	}

    once the loop ends, you can check if ($found)

  10. mamouneyya
    Member
    Posted 3 years ago #

    Thanks you Julia. With the help of your code, I got it working :)

    foreach( $attachments as $item ) {
    		$mime_types = explode( "/", get_post_mime_type( $item->ID ) );
    		if ( in_array( 'image', $mime_types ) ) {
    			$found = true;
    			break;
    		}
    	}
  11. iansampaio
    Member
    Posted 3 years ago #

    Hi @mamouneyya,

    Can you please paste the full final function? I really appreciate if you do!

    thx!

  12. mamouneyya
    Member
    Posted 3 years ago #

    /*  Function to show the post gallery just if it exists  */
    function show_gallery( $post_id ) {
    	$args = array(
    		'post_type' => 'attachment',
    		'numberposts' => null,
    		'post_status' => null,
    		'post_parent' => $post_id
    	);
    	$attachments = get_posts( $args );
    	$is_images = false;
    	// make sure the attachment(s) are image(s). otherwise, ignore them
    	foreach( $attachments as $item ) {
    		$mime_types = explode( "/", get_post_mime_type( $item->ID ) );
    		if ( in_array( 'image', $mime_types ) ) {
    			$is_images = true;
    			break;
    		}
    	}
    
    	if ( $is_images )
    		echo do_shortcode( '[gallery columns="3"]' );
    	else
    		echo '<p id="no_gallery">' . __( 'Sorry, no photos for this item.' ) . '</p>';
    }
  13. atreidex
    Member
    Posted 2 years ago #

    Thank you everyone, this helped me a lot!

    Cheers,
    Ciprian

Topic Closed

This topic has been closed to new replies.

About this Topic

Tags