Il a été dit à plusieurs reprises que Wordpress génère un code vraiment mauvais pour la fonction de galerie intégrée.
Il s'agit du code principal responsable de la sortie de la galerie (dans /wp-includes/media.php):
function gallery_shortcode($attr) {
global $post;
static $instance = 0;
$instance++;
// Allow plugins/themes to override the default gallery template.
$output = apply_filters('post_gallery', '', $attr);
if ( $output != '' )
return $output;
// 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'>";
$output .= "
<{$icontag} class='gallery-icon'>
$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;
}
Que voudrais-je corriger?
[1] Le code ci-dessus renvoie le style CSS directement dans le message. Je veux arrêter cela, car je peux facilement ajouter le même code CSS dans ma feuille de style style.css.
[2] Je souhaite désactiver le code de sortie des légendes d'images sous leurs miniatures. Je souhaite que les légendes soient affichées uniquement sur les pages des pièces jointes, et non dans le message.
[3] Le code susmentionné ajoute deux <br style="clear: both;">
éléments après le code de la galerie. Je voudrais également désactiver cela, car je peux utiliser "margin" dans le code CSS pour cela.
Je voudrais accomplir les "TROIS" choses ci-dessus en utilisant du code PHP dans le functions.php
fichier, car l'édition des fichiers de base n'est pas recommandée.
J'espère que quelqu'un pourra vous aider. (Je ne sais pas coder, alors soyez aussi clair que possible.) Merci!
PERTINENT: Le fichier source à regarder est /wp-includes/media.php
(voici la version du tronc - chercher la gallery_shortcode
fonction).
Réponses:
Comme il a été mentionné avant de supprimer le shortcode et de l'ajouter à nouveau, il n'est pas compatible avec d'autres galeries de modification de plugins, vous utilisez donc le
post_gallery
crochet de filtre et le même code de lagallery_shortcode
fonction, mais avec votre propre modification par exemple, j'ai commenté le pièces dont vous ne voulez pas:la source
function my_own_gallery($output, $attr) { ...
Voir l' édition de badlearner ci-dessous
Vous pouvez supprimer le shortcode par défaut et créer le vôtre. Comme ça (dans votre functions.php):
Le moyen le plus simple de modifier le shortcode est de le copier-coller dans votre functions.php et de changer la fonction pour nommer quelque chose comme
my_own_gallary
et commencer à éditer.ÉDITER
Comme l'ont souligné les Goldenapples dans les commentaires: il existe un filtre pour le shortcode de la galerie, donc pas besoin de supprimer le shortcode en premier.
exemple que vous pouvez utiliser dans votre functions.php (la sortie est le shortcode de la galerie par défaut, vous pouvez donc le modifier).
Explication: Dans le shortcode défini par WordPress vous verrez:
Cela signifie que si un filtre est appliqué et renvoie quelque chose, il sera utilisé (retourné), sinon la fonction continue (shortcode par défaut).
Pour ajouter un filtre, vous utilisez la fonction add_filter . Le premier argument est la balise du filtre (dans ce cas 'post_gallery'), le second la fonction à ajouter (la fonction qui renverra la sortie de votre galerie personnalisée).
Ainsi, cela produira un "test" pour le shortcode [galerie]:
Dans mon exemple ci-dessous, vous verrez le filtre add_filter pour créer le shortcode par défaut avec votre propre code modifiable. Vous pouvez modifier cela ou recommencer à zéro à votre guise.
( EDIT by Otto: Ce qui précède a maintenant été corrigé par Otto. @RobVermeer manquait le premier paramètre du filtre et n'a pas fait le add_filter correctement. Le filtre post_gallery est la bonne façon de le faire. Supprimer le shortcode et l'ajouter (comme essayé par badlearner ci-dessous) n'est pas conseillé car il est également incompatible avec d'autres plugins modifiant des galeries.)
Ajouté / édité par badlearner :
La méthode de filtrage pour modifier le code de la galerie (dans /wp-includes/media.php) à l'aide de functions.php, telle que fournie par @RobVermeer ne semble pas fonctionner correctement (voir les commentaires de cette réponse).
Mais la première réponse de @ RobVermeer (c'est-à-dire avant la première édition), qui désenregistre le shortcode de la galerie et enregistre un nouveau shortcode de la galerie, a fonctionné. Et voici le code, et n'hésitez pas à modifier ou à ajouter une réponse s'il y a une meilleure façon .
Voici le code qui doit être ajouté dans le fichier functions.php de votre thème:
la source
[gallery]
lui-même ou autre chose?[my_own_gallery]
??[gallery]
En effet. Si vous copiez-collez ceci dans votre function.php, vous verrez exactement la même sortie dans vos messages. Mais si vous modifiez le code, vous pouvez vous l'approprier.Eh bien, c'est toujours là dans la nouvelle version de wordpress à partir de la version 3.8.
la source
add_filter( 'use_default_gallery_style', '__return_false' );
la source