Se ha hablado muchas veces que Wordpress genera un código realmente malo para la función de galería incorporada.
Este es el código central responsable de la salida de la galería (en /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;
}
¿Qué me gustaría arreglar?
[1] El código anterior muestra el estilo CSS directamente en la publicación. Quiero detener eso, ya que puedo agregar fácilmente el mismo código CSS en mi hoja de estilo style.css.
[2] Quiero deshabilitar el código de la salida de subtítulos de imágenes debajo de sus miniaturas. Quiero que los subtítulos se muestren solo en las páginas adjuntas, y no en la publicación.
[3] El código antes mencionado agrega dos <br style="clear: both;">
elementos después del código de la galería. También me gustaría deshabilitar eso, ya que puedo usar "margen" en el código CSS para eso.
Me gustaría lograr las "TRES" cosas anteriores usando algún código PHP en el functions.php
archivo, ya que no se recomienda editar los archivos principales.
Espero que alguien pueda ser de alguna ayuda. (No sé cómo codificar, por lo tanto, sea lo más claro posible). ¡Gracias!
RELEVANTE: El archivo de origen para mirar es /wp-includes/media.php
(aquí está la versión de troncal - busque la gallery_shortcode
función).
Respuestas:
Como se mencionó antes de eliminar el shortcode y volver a agregarlo, no es compatible con otros complementos que modifican las galerías, por lo que en su lugar utiliza el
post_gallery
gancho de filtro y el mismo código de lagallery_shortcode
función, pero con su propia modificación, he comentado el partes que no quieres:fuente
function my_own_gallery($output, $attr) { ...
Vea la edición de badlearner a continuación
Puede eliminar el shortcode predeterminado y crear el suyo propio. Me gusta así (en tu functions.php):
La forma más fácil de alterar el shortcode es copiar y pegarlo en functions.php y cambiar la función para nombrar algo así
my_own_gallary
y comenzar a editar.EDITAR
Como señala goldenapples en los comentarios: hay un filtro para el shortcode de la galería, por lo que no es necesario eliminarlo primero.
ejemplo que puede usar en functions.php (la salida es el código abreviado predeterminado de la galería, por lo que puede modificarlo).
Explicación: En el shortcode definido por WordPress verá:
Esto significa que si se aplica un filtro y devuelve algo, se usará (se devolverá); de lo contrario, la función continuará (código corto predeterminado).
Para agregar un filtro, usa el función add_filter . El primer argumento es la etiqueta del filtro (en este caso 'post_gallery'), el segundo la función para agregar (la función que devolverá la salida de la galería personalizada).
Entonces esto generará "prueba" para el shortcode [galería]:
En la edición de mi ejemplo a continuación, verá add_filter para crear el shortcode predeterminado con su propio código editable. Puede editar esto o comenzar desde cero como lo desee.
( EDITAR por Otto: Otto ha solucionado lo anterior. @RobVermeer no tenía el primer parámetro en el filtro y no hizo el add_filter correctamente. El filtro post_gallery es la forma correcta de hacerlo. Quitar el shortcode y volver agregarlo (como lo prueba badlearner a continuación) no es aconsejable ya que también es incompatible con otros complementos que modifican las galerías).
Agregado / editado por badlearner :
El método de filtro para modificar el código de la galería (en /wp-includes/media.php) usando functions.php, como lo proporciona @RobVermeer, no parece funcionar correctamente (vea los comentarios de esta respuesta).
Pero la primera respuesta de @ RobVermeer (es decir, antes de la primera edición), que anula el registro del shortcode de la galería y registra un nuevo shortcode de la galería, funcionó. Y aquí está el código, y siéntase libre de editar o agregar una respuesta si hay una mejor manera .
El siguiente es el código que debe agregarse en el archivo functions.php de su tema:
fuente
[gallery]
en sí o algo más?[my_own_gallery]
??[gallery]
en efecto. Si copia y pega esto en su function.php, verá exactamente el mismo resultado en sus publicaciones. Pero si edita el código, puede hacerlo suyo.bueno, todavía está ahí en la nueva versión de WordPress a partir de 3.8 aquí está la solución que hice para eliminar que usaba el mismo código anterior pero agregó un par de líneas
fuente
add_filter( 'use_default_gallery_style', '__return_false' );
fuente