WordPressのギャラリーをカスタム

構築・開発WordPress

WordPressのギャラリーの表示部分をCSSで自由にしたい!!

下記コードをfunctions.php に追加してください。

<?php
/* デフォルトの gallery ショートコードを削除 */
remove_shortcode('gallery', 'gallery_shortcode');

/* gallery ショートコードをカスタム */
add_shortcode('gallery', 'custom_gallery_shortcode');
function custom_gallery_shortcode($attr) {
    $post = get_post();

    static $instance = 0;
    $instance++;

    if ( ! empty( $attr['ids'] ) ) {
        if ( empty( $attr['orderby'] ) )
            $attr['orderby'] = 'post__in';
        $attr['include'] = $attr['ids'];
    }

    $output = apply_filters('post_gallery', '', $attr);
    if ( $output != '' )
        return $output;

    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 ? $post->ID : 0,
        'itemtag'    => 'li',
        'icontag'    => 'figure', //画像のタグ
        'captiontag' => 'figcaption', //キャプションのタグ
        'columns'    => 1,
        'size'       => 'thumbnail', //サムネイルサイズ
        'include'    => '',
        'exclude'    => '',
        'link'       => ''
    ), $attr, 'gallery'));

    $id = intval($id);
    if ( 'RAND' == $order )
        $orderby = 'none';

    if ( !empty($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) ) {
        $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);
    $icontag = tag_escape($icontag);
    $valid_tags = wp_kses_allowed_html( 'post' );
    if ( ! isset( $valid_tags[ $itemtag ] ) )
        $itemtag = 'dl';
    if ( ! isset( $valid_tags[ $captiontag ] ) )
        $captiontag = 'dd';
    if ( ! isset( $valid_tags[ $icontag ] ) )
        $icontag = 'dt';

    $columns = intval($columns);
    $itemwidth = $columns > 0 ? floor(100/$columns) : 100;
    $float = is_rtl() ? 'right' : 'left';

    $selector = "gallery-{$instance}";

    $gallery_style = $gallery_div = '';

    $size_class = sanitize_html_class( $size );
    $gallery_div = "<ul id='$selector' class='gallery'>\n";
    $output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
        $image = wp_get_attachment_image_src($id, $size);
        $full = wp_get_attachment_image_src($id, 'large');
        $image_output = '<a href="'.$full[0].'" data-lightbox="lightbox" data-title="'.wptexturize($attachment->post_excerpt).'"><img src="'.$image[0].'" alt="'.wptexturize($attachment->post_excerpt).'" class="over"></a>';

        $image_meta  = wp_get_attachment_metadata( $id );

        $orientation = '';
        if ( isset( $image_meta['height'], $image_meta['width'] ) )
            $orientation = ( $image_meta['height'] > $image_meta['width'] ) ? 'portrait' : 'landscape';

        $output .= "<{$itemtag} class='gallery-item'>\n";
        $output .= "<{$icontag} class='{$orientation}'>
                $image_output\n";
                
        $output .= "</{$icontag}>";
        $output .= "</{$itemtag}>\n";
    }
    $output .= "</ul>\n";

    return $output;
}

使っていない処理とかも残ってたりしますが、このコードを入れることによって、下記のようなシンプルなコードが出力されるようになります。

<ul id='gallery-1' class='gallery'>
  <li class='gallery-item'>
    <figure class='portrait'>
      <a href="http://example.com/wp-content/uploads/dummy.jpg" data-lightbox="lightbox" data-title="タイトル">
        <img src="http://example.com/wp-content/uploads/thumbnail.jpg" alt="タイトル" class="over"></a>
    </figure>
  </li>
  <li class='gallery-item'>
    <figure class='landscape'>
      <a href="http://example.com/wp-content/uploads/dummy.jpg" data-lightbox="lightbox" data-title="タイトル">
        <img src="http://example.com/wp-content/uploads/thumbnail.jpg" alt="タイトル" class="over"></a>
    </figure>
  </li>
</ul>

今回は、Lightboxを使うようにタグを調整しています。
出力部分のコードは、97行目あたりを弄れば自由に吐き出すことが可能です。

※このコードを追加すると、管理画面上の「ギャラリーの設定」は機能しなくなります。
サムネイルサイズやカラム数を設定したところ、この関数で固定になります。
サムネイルサイズを変えるときには、37行目の値を変更してください。
カラムなどのレイアウトについては、基本CSSで調整することなります。

わかりやすい参考サイト

使いづらいWordPressのギャラリーをけっこう使えるギャラリーにする方法

コメント

スポンサーリンク
タイトルとURLをコピーしました