web-dev-qa-db-ja.com

Post_galleryを使用してギャラリーにcontainer divを追加する

私はWordPressギャラリーにコンテナdivを追加しようとしています、私はこれまでのところこれを持っています....

function gallery_custom( $output ) {

    $return = '<div class="mydiv">';
    $return = $output;
    $return = '</div>';

    return $return;
}

add_filter( 'post_gallery', 'gallery_custom', 10, 3 );

これは何も返さないことで、間違っているところで何かアイデアはありますか?

1
fightstarr20

これを達成するためには、次のようにもっとカスタムコードを開発する必要があります。

function gallery_custom( $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 '';

    $output = '<div class="mydiv">';

    // Here's your actual output, you may customize it to your need
    $output .= "<div class='gallery galleryid-$columns gallery-columns-$columns gallery-size-$size'>";

    // 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, $size );

        $output .= '<figure class="gallery-item"><div class="gallery-icon landscape">';
        $output .= '<img src="' . $img[0] . '" width="' . $img[1] . '" height="' . $img[2] . '" alt="" />';
        $output .= '</div>';
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='gallery-caption'>
                " . wptexturize($attachment->post_excerpt) . "
                </{$captiontag}>";
        }
        $output .= '</figure>';
    }

    $output .= '</div></div>';

    return $output;
}

add_filter( 'post_gallery', 'gallery_custom', 10, 2 );
2
Vinod Dalvi

HTMLラッパーをギャラリーに追加するには、post_galleryフィルターを使用します。これは完全にコメントされた例です。

add_filter( 'post_gallery', 'gallery_custom', 10, 3 );
/**
 * Filters the default gallery shortcode output.
 *
 * If the filtered output isn't empty, it will be used instead of generating
 * the default gallery template.
 *
 * @see gallery_shortcode()
 *
 * @param string $output   The gallery output. Default empty.
 * @param array  $attr     Attributes of the gallery shortcode.
 * @param int    $instance Unique numeric ID of this gallery shortcode instance.
 */
function gallery_custom( $output, $attr, $instance ) {
    // Remove the filter to prevent infinite loop.
    remove_filter( 'post_gallery', 'gallery_custom', 10, 3 );

    // Add opening wrapper.
    $return = '<div class="mydiv">';

    // Generate the standard gallery output.
    $return .= gallery_shortcode( $attr );

    // Add closing wrapper.
    $return .= '</div>';

    // Add the filter for subsequent calls to gallery shortcode.
    add_filter( 'post_gallery', 'gallery_custom', 10, 3 );

    // Finally, return the output.
    return $return;
}
  • gallery_custom()では、gallery_shortcode()を呼び出す前にpost_galleryフィルターを削除することが重要です。そうでなければ、無限ループに陥ります。

  • 出力は$returnに連結する必要があることに注意してください。元のコードでは、文字列の初期化後に$returnの代わりに=が使用されるため、.=は継続的に上書きされています。

  • メインの出力は標準のギャラリー出力関数gallery_shortcode( $attr );を使って生成されます。この時点でフィルタは削除されているので、この呼び出しではフィルタは適用されません。

  • ギャラリの出力が$returnに連結された後、終了するHTMLタグを追加し、フィルタを追加して、次回ギャラリのショートコード関数が呼び出されたときに実行されるようにします。

  • 最後に出力を返します。

別の解決策:[gallery] shortcode関数を置き換えます。

これは問題を解決するための別のアプローチです。今回はデフォルトのギャラリ出力関数gallery_shortcode()galleryショートコード文字列から削除されています。次に、置換関数wpse_custom_gallery_shortcode()が元のgalleryショートコード文字列に配線されます。

// Replace the default [gallery] shortcode function with a custom function.
add_action( 'init', 'wpse_replace_gallery_shortcode' ); 
function wpse_replace_gallery_shortcode() {
    remove_shortcode( 'gallery', 'gallery_shortcode' );
    add_shortcode( 'gallery', 'wpse_custom_gallery_shortcode' );
}

// Customized gallery shortcode function.
// See gallery_shortcode() for documentation.
function wpse_custom_gallery_shortcode( $attr ) {
    $gallery = gallery_shortcode( $attr );

    if ( $gallery ) {
        return '<div class="mydiv">' . $gallery . '</div>';
    }
} 
2
Dave Romsey