Wie kann ich die Ausgabe des WP-Bildergalerie-Shortcodes von einem Plugin anpassen?

17

Wir bauen ein Plugin, das Beiträge anzeigt, und wir möchten auch die Bildergalerie anzeigen, wenn sie in einem Beitrag verwendet wird. Müssen wir jedoch die Anzahl der angezeigten Fotos begrenzen? Ist das möglich?

jnthnclrk
quelle

Antworten:

36

Es gibt zwei Möglichkeiten, wie Sie vorgehen können, aber beide umfassen das Erstellen einer Funktion, die im Wesentlichen dieselbe Funktion wie die vorhandene Galerie-Shortcode-Funktion ausführt ...

Du kannst entweder..

  1. Hängen Sie post_gallerydie eingehenden Daten ein und bearbeiten Sie sie (Sie können die Galerie-Shortcode-Funktion bei Bedarf als Basis für den Filter verwenden).
  2. Heben Sie die Registrierung des Galerie-Shortcodes auf und registrieren Sie einen neuen Galerie-Shortcode mit Änderungen (bei Bedarf können Sie auch hier die vorhandene Funktion als Basis verwenden).

Ich habe in diesem Thread etwas Ähnliches gemacht , und ich beziehe mich nur darauf, weil ich für das folgende Beispiel den gleichen Ansatz verfolgen werde.

Beispielfilter für den Galerie-Shortcode

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'       => '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];
        }
    } 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: 10px;
                text-align: center;
                width: {$itemwidth}%;           }
            #{$selector} img {
                border: 2px solid #cfcfcf;
            }
            #{$selector} .gallery-caption {
                margin-left: 0;
            }
        </style>
        <!-- see gallery_shortcode() in wp-includes/media.php -->
        <div id='$selector' class='gallery galleryid-{$id}'>");

    $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;
}

Ändern Sie diese Funktion, um die gewünschten Einschränkungen festzulegen (es ist nur eine Basis).

Den Hook, den ich verwende, finden Sie in wp-includes/media.phpder Funktion für den Rückruf von Galerie-Shortcodes (siehe Zeile 763).

http://core.trac.wordpress.org/browser/tags/3.0.1/wp-includes/media.php#L745

Ich hoffe, das hilft.. :)

t31os
quelle
danke für den Tipp. Ich habe jetzt 2 Stunden nach diesem **** Filter gesucht. +1
Kaiser
Scheint wie in WP 4.2.2 die 'orderby' => 'menu_order ID' nicht mehr zu funktionieren?
Erdnüsse
-2

Sie können die Anzahl der Bilder pro Galerie festlegen. Dies kann über die Registerkarte Galerie in der Media-Thickbox im Post-Editor konfiguriert werden. Nachdem Sie die Galerie bereits eingefügt haben, können Sie sie vermutlich bearbeiten, indem Sie sie im visuellen Editor bearbeiten.

hakre
quelle