Change WordPress default gallery output

I am looking to use the WordPress gallery shortcut but I want to tie the output into the Foundation Orbit plugin (to make a slider). This is the HTML I am looking to output:

<div class="slideshow-wrapper">
    <div class="preloader"></div>
    <ul data-orbit>
        <li>
            <img src="img1.png" alt="bla bla bla" />
        </li>
        <li>
            <img src="img2.png" alt="bla bla bla" />
        </li>
        <li>
            <img src="img3.png" alt="bla bla bla" />
        </li>
        <li>
            <img src="img4.png" alt="bla bla bla" />
        </li>
    </ul>
</div>

Is it possible to put something in functions.php (or similar) to achieve this?

Related posts

Leave a Reply

5 comments

  1. Yes, indeed. Quite a while ago I’ve found this code and have been using it ever since. It’s great to customize WP’s default gallery to whatever you want.

    There’s a filter to post_gallery which you can use to customize all default WP galleries. Here’s a sample of the code I use adapted to the template you provided. I’ve cleared it up as much as possible.

    The first part of the function is pretty much gallery attachments handling, so you’ll probably just want to change the latter half, the one that determines the output of your gallery template (follow the comments):

    add_filter('post_gallery', 'my_post_gallery', 10, 2);
    function my_post_gallery($output, $attr) {
        global $post;
    
        if (isset($attr['orderby'])) {
            $attr['orderby'] = sanitize_sql_orderby($attr['orderby']);
            if (!$attr['orderby'])
                unset($attr['orderby']);
        }
    
        extract(shortcode_atts(array(
            'order' => 'ASC',
            'orderby' => 'menu_order ID',
            'id' => $post->ID,
            'itemtag' => 'dl',
            'icontag' => 'dt',
            'captiontag' => 'dd',
            'columns' => 3,
            'size' => 'thumbnail',
            'include' => '',
            'exclude' => ''
        ), $attr));
    
        $id = intval($id);
        if ('RAND' == $order) $orderby = 'none';
    
        if (!empty($include)) {
            $include = preg_replace('/[^0-9,]+/', '', $include);
            $_attachments = get_posts(array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby));
    
            $attachments = array();
            foreach ($_attachments as $key => $val) {
                $attachments[$val->ID] = $_attachments[$key];
            }
        }
    
        if (empty($attachments)) return '';
    
        // Here's your actual output, you may customize it to your need
        $output = "<div class="slideshow-wrapper">n";
        $output .= "<div class="preloader"></div>n";
        $output .= "<ul data-orbit>n";
    
        // Now you loop through each attachment
        foreach ($attachments as $id => $attachment) {
            // Fetch the thumbnail (or full image, it's up to you)
    //      $img = wp_get_attachment_image_src($id, 'medium');
    //      $img = wp_get_attachment_image_src($id, 'my-custom-image-size');
            $img = wp_get_attachment_image_src($id, 'full');
    
            $output .= "<li>n";
            $output .= "<img src="{$img[0]}" width="{$img[1]}" height="{$img[2]}" alt="" />n";
            $output .= "</li>n";
        }
    
        $output .= "</ul>n";
        $output .= "</div>n";
    
        return $output;
    }
    

    Just paste it to your functions.php file and modify to adapt it to your need. I’m pretty sure it’ll work for you as it have worked for me 🙂

  2. Super answer Mathielo.

    However, I needed the option of including a caption, so I’ve modified your code to use the wp_prepare_attachment_for_js() function as that seems to provide the necessary data.

    add_filter('post_gallery', 'my_post_gallery', 10, 2);
    function my_post_gallery($output, $attr) {
    global $post;
    
    if (isset($attr['orderby'])) {
        $attr['orderby'] = sanitize_sql_orderby($attr['orderby']);
        if (!$attr['orderby'])
            unset($attr['orderby']);
    }
    
    extract(shortcode_atts(array(
        'order' => 'ASC',
        'orderby' => 'menu_order ID',
        'id' => $post->ID,
        'itemtag' => 'dl',
        'icontag' => 'dt',
        'captiontag' => 'dd',
        'columns' => 3,
        'size' => 'thumbnail',
        'include' => '',
        'exclude' => ''
    ), $attr));
    
    $id = intval($id);
    if ('RAND' == $order) $orderby = 'none';
    
    if (!empty($include)) {
        $include = preg_replace('/[^0-9,]+/', '', $include);
        $_attachments = get_posts(array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby));
    
        $attachments = array();
        foreach ($_attachments as $key => $val) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    }
    
    if (empty($attachments)) return '';
    
    // Here's your actual output, you may customize it to your need
    $output = "<div class="slideshow-wrapper">n";
    $output .= "<div class="preloader"></div>n";
    $output .= "<ul data-orbit>n";
    
    // Now you loop through each attachment
    foreach ($attachments as $id => $attachment) {
        // Fetch all data related to attachment 
        $img = wp_prepare_attachment_for_js($id);
    
        // If you want a different size change 'large' to eg. 'medium'
        $url = $img['sizes']['large']['url'];
        $height = $img['sizes']['large']['height'];
        $width = $img['sizes']['large']['width'];
        $alt = $img['alt'];
    
        // Store the caption
        $caption = $img['caption'];
    
        $output .= "<li>n";
        $output .= "<img src="{$url}" width="{$width}" height="{$height}" alt="{$alt}" />n";
    
        // Output the caption if it exists
        if ($caption) { 
            $output .= "<div class="orbit-caption">{$caption}</div>n";
        }
        $output .= "</li>n";
    }
    
    $output .= "</ul>n";
    $output .= "</div>n";
    
    return $output;
    }
    
  3. I know the original question has been answered but I just wanted to share what I’ve done with the filter snippet in case it helps anyone else. I’ve enabled Miro Mannino’s ‘Justified Gallery’ jquery plugin http://miromannino.com/projects/justified-gallery/ to work with WordPress galleries in WordPress 3.9 … Here’s the code with the changes I made to get it to work… (img size light thumb is my custom thumbnail to preserve image dimensions but keep page load times down.)

    // Custom Gallery
    
    add_filter( 'post_gallery', 'my_post_gallery', 10, 2 );
    function my_post_gallery( $output, $attr) {
    global $post, $wp_locale;
    
    static $instance = 0;
    $instance++;
    
    // We're trusting author input, so let's at least make sure it looks like a valid orderby statement
    if ( isset( $attr['orderby'] ) ) {
        $attr['orderby'] = sanitize_sql_orderby( $attr['orderby'] );
        if ( !$attr['orderby'] )
            unset( $attr['orderby'] );
    }
    
    extract(shortcode_atts(array(
        'order'      => 'ASC',
        'orderby'    => 'menu_order ID',
        'id'         => $post->ID,
        'itemtag'    => 'dl',
        'icontag'    => 'dt',
        'captiontag' => 'dd',
        'columns'    => 3,
        'size'       => 'light-thumb',
        'include'    => '',
        'exclude'    => ''
    ), $attr));
    
    $id = intval($id);
    if ( 'RAND' == $order )
        $orderby = 'none';
    
    if ( !empty($include) ) {
        $include = preg_replace( '/[^0-9,]+/', '', $include );
        $_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    
        $attachments = array();
        foreach ( $_attachments as $key => $val ) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    } elseif ( !empty($exclude) ) {
        $exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
        $attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    } else {
        $attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
    }
    
    if ( empty($attachments) )
        return '';
    
    if ( is_feed() ) {
        $output = "n";
        foreach ( $attachments as $att_id => $attachment )
            $output .= wp_get_attachment_link($att_id, $size, true) . "n";
        return $output;
    }
    
    $itemtag = tag_escape($itemtag);
    $captiontag = tag_escape($captiontag);
    $columns = intval($columns);
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';
    
    $selector = "gallery-{$instance}";
    
    $output = apply_filters('gallery_style', "
        <style type='text/css'>
            #{$selector} {
                margin: auto;
            }
            #{$selector} .gallery-item {
                float: {$float};
                margin-top: 0px;
                text-align: center;
                width: {$itemwidth}%;           }
            #{$selector} img {
                border: 0;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->
    
    
        <div id='$selector' class='gallery galleryid-{$id}'>");
        $output = "<div id="mygallery">n";
    
    
    
    
    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $link = isset($attr['link']) && 'file' == $attr['link'] ? wp_get_attachment_link($id, $size, false, false) : wp_get_attachment_link($id, $size, true, false);
    
    
        $output .= "<{$itemtag} class='gallery-item'>";
        $output .= "
            <{$icontag} class='gallery-icon'>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
        $output .= "</{$itemtag}>";
        if ( $columns > 0 && ++$i % $columns == 0 )
            $output .= '<br style="clear: both" />';
    }
    
    $output .= "
        <br style='clear: both;' />
        </div>n";
    
    
    return $output;
    
    }
    

    It works a treat. Thanks for sharing the filter – it was just what I was looking for.

  4. So if you want output another string like img title or img desc just use this construction

    $title = $img[‘title’];

    This is comment to Super answer Mathielo (second answer), and this universal solution, not only zubr foundation

  5. Little note! If not disabled in admin area, this filter will cause gallery not to be visible in admin area. To avoid this, we can run filters main part inside if statement

    add_filter('post_gallery', 'my_post_gallery', 10, 2);
    function my_post_gallery($output, $attr)
    {
        // Disable function in admina area. 
        if (is_admin()) {
            return;
        } else {
          // put main code in here
        }
    }