web-dev-qa-db-fra.com

add_filter et modification des légendes de sortie de la galerie d'images

Je souhaite modifier uniquement une sortie de la version native WP Gallery (dans le fichier media.php).

Sur Smashing Magazine ( link ), l’auteur recommande de modifier toute la fonction gallery_shortcode. Mais je me suis demandé s'il est possible de ne changer que la sortie spécifique ($ captiontag)

J'ai écrit:

add_filter( 'captiontag', 'my_captiontag' );

function my_captiontag( $captiontag ) {
 $output .= "
  <{$captiontag} class='wp-caption-text gallery-caption'><p>
  " . wptexturize($attachment->post_excerpt) . "
  </p></{$captiontag}>";
}

mais ça ne marche pas :(

5
cachaito

Il n'y a pas de crochet de filtre appelé captiontag. Vous pouvez modifier la valeur de la balise html de légende en spécifiant l'option captiontag lors de l'insertion du shortcode [gallery].

De la page de codex de galerie de la galerie }:

captiontag

le nom de la balise XHTML utilisée pour entourer chaque légende. La valeur par défaut est "dd". Par exemple, pour modifier le marquage de la galerie afin qu’il utilise les balises div, span et p:

[gallery itemtag="div" icontag="span" captiontag="p"]

Mettre à jour:

Le code suivant écrasera la sortie par défaut [gallery]. Il s’agit d’une copie de la fonction gallery_shotcode() avec une modification permettant d’afficher le titre de l’image enveloppé dans la balise <h3> avant l’image:

add_filter('post_gallery', 'my_gallery_shortcode', 10, 2);

function my_gallery_shortcode($output, $attr) {
    global $post;

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

    $gallery_style = $gallery_div = '';
    if ( apply_filters( 'use_default_gallery_style', true ) )
        $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 -->";
    $size_class = sanitize_html_class( $size );
    $gallery_div = "<div id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}'>";
    $output = apply_filters( 'gallery_style', $gallery_style . "\n\t\t" . $gallery_div );

    $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'>";
        // Here we add the image title
        $output .= "
            <{$icontag} class='gallery-icon'>
                <h3>$attachment->post_title</h3>
                $link
            </{$icontag}>";
        if ( $captiontag && trim($attachment->post_excerpt) ) {
            $output .= "
                <{$captiontag} class='wp-caption-text 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;
}
1
Ahmad M

Il n'est pas nécessaire de copier le shortcode gallery. Il suffit de définir votre fonction de filtrage entre la sortie du gestionnaire natif et la sortie finale.

Pour ce faire, piratez le gestionnaire de shortcode, puis exécutez un preg_replace_callback() sur la sortie.

add_action( 'after_setup_theme', 'wpse_74515_replace_gallery_shortcode' );

/**
 * Replace the default shortcode handlers.
 *
 * @wp-hook after_setup_theme
 * @return  void
 */
function wpse_74515_replace_gallery_shortcode()
{
    // overwrite the native shortcode handler
    add_shortcode( 'gallery', 'wpse_74515_gallery_shortcode' );
}
/**
 * Create a filtered gallery output.
 *
 * @wp-hook gallery
 * @param   array $attr
 * @return  string
 */
function wpse_74515_gallery_shortcode( $attr )
{
    // Default value in WordPress.
    $captiontag = 'dd';

    // User value.
    isset ( $attr['captiontag'] ) && $captiontag = $attr['captiontag'];

    // Let WordPress create the regular gallery …
    $gallery = gallery_shortcode( $attr );

    // change the content of the caption
    $gallery = preg_replace_callback(
        '~(<' . $captiontag . '.*>)(.*)(</' . $captiontag . '>)~mUus',
        'wpse_74515_gallery_callback',
        $gallery
    );

    return $gallery;
}
/**
 * Change the result of the regex match from wpse_74515_gallery_shortcode.
 *
 * @param  array $m matches
 * @return string
 */
function wpse_74515_gallery_callback( $m )
{
    return $m[1] . wptexturize( $m[2] ) . $m[3];
}

Messages similaires

7
fuxia