Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I am trying to preview a NextGen gallery on my main page (and category pages) to show a single image from the gallery on the main page next to the text from the post that normally shows up. I have found examples of PHP that get the images from a gallery given a gallery ID. In my loop I have a current post. What I cannot figure out is how to, given a post, get the attributes of the [nggallery] short code.

In other words for each post with a NextGEN gallery I need the id value form the short code. For example if the post contains [nggallery id=50] I need the value 50.

How can I get that information from a post?

I was hoping to find the solution in the source code of the next gen plug-in but of course that code registered a short code handler and lets WP call them back. There are no examples in their source code where they parse a post looking for their short code.

share|improve this question
    
I just found this question which mentions get_shortcode_regex which has an example that would let me find out if the nggallery short code was in a post. Still nothing that would let me see the attributes of said short code. –  Ian Lelsie Jun 28 '12 at 20:59
add comment

1 Answer

up vote 1 down vote accepted

I have found a solution. After a bunch of searching around I found some code that determines if a post has a specific short code in it.

That code also has some attempt to parse the parameters to the short code. Which is good because I want the gallery ID. There were some issues with the code as posted so I tweaked it. Here is code that can find a short code in a post and get its parameters:

        <?php //  Look for a NextGEN gallery
        $galleryID;
        $previewIndex = 1; 
        $regex_pattern = get_shortcode_regex();
        preg_match ('/'.$regex_pattern.'/s', $post->post_content, $regex_matches);
        if ($regex_matches[2] == 'nggallery') :
            //  Found a NextGEN gallery find out what ID
            //  Turn the attributes into a URL parm string
            $attribureStr = str_replace (" ", "&", trim ($regex_matches[3]));
            $attribureStr = str_replace ('"', '', $attribureStr);

            //  Parse the attributes
            $defaults = array (
                'preview' => '1',
            );
            $attributes = wp_parse_args ($attribureStr, $defaults);

            if (isset ($attributes["id"])) :
                $galleryID = $attributes["id"];
            endif;
            if (isset($attributes["preview"])) :
                $previewIndex = $attributes["preview"];
            endif;
        endif;
        ?>

What needed to be tweaked was the handling of the parameters. Using trim instead of some secret charter and switching to wp_parse_args to correctly handle the short code parameters. Once the above code finishes executing in a WP loop $galleryID will hold the NextGEN gallery ID and previewIndex will be set to the preview index or 1 if no previewIndex attribute was present.

previewIndex is an attribute I "added" to indicate what thumbnail to use for the gallery preview. NextGEN ignores it and the galleries render as normal but now I can use it for my Theme to display a specific icon in the preview entry.

Here is the code from my loop-index.php and loop-category.php that handles creating the gallery preview:

            <?php /* Enhance the content preview with an image from the NextGEN gallery */ ?>
            <?php
            global $nggdb;
            $gallery = $nggdb->get_gallery ($galleryID, 'sortorder', 'ASC', true, 0, 0);
            $image = $gallery[$previewIndex];
            $total_images = count ($gallery);
            ?>

            <?php if (isset($image)  &&  isset($image->thumbURL)) : ?>
                <?php /* Show the thumbnail */ ?>
                <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark">
                    <img class="entry-preview-image" src="<?php echo $image->thumbURL ?>" align="left" />
                </a>
            <?php endif; ?>

            <?php /* Show the text excerpt */ ?>
            <?php the_excerpt(); ?>

            <?php /* Show the statement of number of images contained */ ?>
            <em><?php printf( _n( 'This gallery contains <a %1$s>%2$s photo</a>.', 'This gallery contains <a %1$s>%2$s photos</a>.', $total_images, 'twentyten' ),
                'href="' . get_permalink() . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"',
                number_format_i18n( $total_images )); ?>
            </em>
        <?php endif; ?>

This makes use of information from another answer regarding accessing NextGEN gallery objects in order to get the thumbnail and the count of images in the gallery.

share|improve this answer
    
I found the original article that lead to the code I modified –  Ian Lelsie Jun 30 '12 at 1:04
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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