WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I want to create a WordPress shortcode that will add an automated gallery of the contents in a folder. I am currently trying to implement this in a site that publishes 12 annual magazine issues, so as soon as a new PDF or JPG is dropped into a folder, it should be displayed on that specific gallery.

Meaning:

Archive
2013
Jan - Dec months need to be displayed, in a 4x3 or 6x2 grid gallery. If we are in June, and the latest issue is June, then only 6 JPGs would be displayed.

This way the client doesn't need to make any modifications in the WordPress site. Instead the client can just drop the files to a specific folder via FTP, and the WordPress PHP function would auto populate the gallery according to what it's able to fetch from that folder's contents.

EDIT

Unfortunately, the "Folder Gallery" plugin is close but not good enough. It does not read the contents of folders that sit outside the WP uploads folder, and we don't want to migrate the existing folder structure inside the WordPress install folder.

I also need it to open the links in a new window to the PDF of the magazine, and not a larger version of the picture in Fancybox.

share|improve this question
    
You may be able to integrate the ImgBrowz0r class which does read the contents of a directory and creates a gallery of preview images in a grid layout. – iyrin Jun 11 '13 at 1:20
    
Is there a ImgBrowz0r plugin outhere i can just grab? i am pretty new when it come to php – Fred Jul 3 '13 at 18:53
    
Did you ever find a solution? I have a similar situation. – Ricardo Andres Nov 19 '15 at 15:16

It sounds like you just need shortcode to gather the contents of a folder and display a grid of those items. The shortcode is pretty easy to setup.

$gallery = do_shortcode('[folder_gallery title="XYZ" folder="wp-content/uploads/2015/11"]' ); 
echo $gallery; 

Then you just need to glob a directory and render your gallery from the files. I didn't include a gallery but this will work outside of uploads. Just give it a path relative to the root folder.

// [folder_gallery folder="wp-content/uploads/2015/11" ]

add_shortcode( 'folder_gallery', 'folder_gallery__shortcode' );

function folder_gallery__shortcode( $atts ) {
    $a = shortcode_atts(
        array (
            'folder' => '',
            'title'  => '',
        ), $atts );

    $folder = $a [ 'folder' ];

    // bad folder
    if ( empty( $folder ) || ! is_readable(ABSPATH . $folder) ) {
        return 'No Valid Folder Selected';
    }

    // allow filtering of the filetypes
    $filetypes = apply_filters( 'folder_gallery_shortcode__filetypes', array ( 'png', 'jpg', 'jpeg', 'gif' ) );

    // glob
    $filetypes = empty( $filetypes ) ? 'png,jpg,jpeg,gif' : implode( ',', $filetypes );
    $files     = glob( untrailingslashit( ABSPATH . $folder ) . "/*.{" . $filetypes . "}", GLOB_BRACE );

    $gallery_images = array ();
    foreach ( $files as $file ) {
        if ( $file === __FILE__ ) {
            continue;
        }

        /*
        $filetype        = wp_check_filetype( $file );
        $ext             = $filetype[ 'ext' ];
        $type            = $filetype[ 'type' ];
        $proper_filename = $filetype[ 'proper_filename' ];
        */

        // replace the filepath with url path for front-end gallery
        $gallery_images[] = str_replace( trailingslashit( ABSPATH ), trailingslashit( WP_SITEURL ), $file );
    }

    // TODO: IMPLEMENT YOUR GALLERY HERE

    // construct the gallery
    $output = empty( $a[ 'title' ] ) ? '' : '<h2>' . $a[ 'title' ] . '</h2>';
    $output .= '<ul>';

    // Loop through each image in each gallery
    foreach ( $gallery_images as $image_url ) {
        $output .= '<li>' . '<img src="' . $image_url . '">' . '</li>';
    }
    $output .= '</ul>';

    // allow filtering of the output
    $gallery = apply_filters( 'folder_gallery_shortcode__gallery', $output, $gallery_images );

    return $gallery;
}
share|improve this answer

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.