Já foi falado muitas vezes que o Wordpress gera um código realmente ruim para a função de galeria embutida.
Este é o código principal responsável pela saída da galeria (em /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;
}
O que eu gostaria de consertar?
[1] O código acima gera o estilo css diretamente no post. Quero interromper isso, pois posso adicionar facilmente o mesmo código css na minha folha de estilo style.css.
[2] Quero desativar o código da saída de legendas das imagens abaixo das miniaturas. Quero que as legendas sejam mostradas apenas nas páginas dos anexos, e não na postagem.
[3] O código mencionado anteriormente adiciona dois <br style="clear: both;">
elementos após o código da galeria. Eu também gostaria de desativar isso, pois posso usar "margem" no código css para isso.
Eu gostaria de realizar as "TRÊS" coisas acima usando algum código PHP no functions.php
arquivo, pois a edição dos arquivos principais não é recomendada.
Espero que alguém possa ajudar. (Não sei como codificar, portanto, seja o mais claro possível.) Obrigado!
RELEVANTE: O arquivo de origem é o seguinte /wp-includes/media.php
(aqui está a versão do tronco - procure a gallery_shortcode
função).
Respostas:
Como foi mencionado antes de remover o código curto e adicioná-lo novamente, ele não é compatível com outros plugins que modificam galerias. Em vez disso, você usa o
post_gallery
gancho de filtro e o mesmo código dagallery_shortcode
função, mas com sua própria modificação, por exemplo, comentei o peças que você não deseja:fonte
function my_own_gallery($output, $attr) { ...
Veja a edição de badlearner abaixo
Você pode remover o código de acesso padrão e criar o seu. Assim (no seu functions.php):
A maneira mais fácil de alterar o código curto é copiá-lo e colá-lo em seu functions.php e alterar a função para nomear para algo como
my_own_gallary
e começar a editar.EDITAR
Como as maçãs douradas nos comentários apontaram: Há um filtro para o código abreviado da galeria; portanto, não é necessário remover o código abreviado primeiro.
exemplo que você pode usar em seu functions.php (a saída é como código de acesso da galeria padrão, para que você possa alterá-lo).
Explicação: No código de acesso definido pelo WordPress, você verá:
Isso significa que, se um filtro for aplicado e retornar algo, que será usado (retornado), caso contrário, a função continuará (código de acesso padrão).
Para adicionar um filtro, você usa a função add_filter . O primeiro argumento é a tag do filtro (neste caso 'post_gallery'), o segundo é a função a ser adicionada (a função que retornará sua saída da galeria personalizada).
Portanto, isso produzirá "test" para o shortcode [galeria]:
No meu exemplo abaixo de edição, você verá o add_filter para criar o código de acesso padrão com seu próprio código editável. Você pode editar isso ou começar do zero como quiser.
( EDIT by Otto: O acima foi corrigido pela Otto. @RobVermeer estava faltando o primeiro parâmetro no filtro e não fez o add_filter corretamente. O filtro post_gallery é a maneira correta de fazer isso. Removendo o código curto e adicionando-o (conforme tentado por badlearner abaixo) não é recomendável, pois também é incompatível com outros plugins que modificam galerias.)
Adicionado / Editado por badlearner :
O método de filtro para modificar o código da galeria (em /wp-includes/media.php) usando o functions.php, conforme fornecido pelo @RobVermeer, parece não estar funcionando corretamente (consulte os comentários desta resposta).
Mas a primeira resposta do @ RobVermeer (ou seja, antes da primeira edição), que cancela o registro do código de acesso da galeria e registra um novo código de acesso da galeria, funcionou. E aqui está o código. Sinta-se à vontade para editar ou adicionar uma resposta, se houver uma maneira melhor .
A seguir, está o código que precisa ser adicionado ao arquivo functions.php do seu tema:
fonte
[gallery]
em si ou algo mais?[my_own_gallery]
??[gallery]
de fato. Se você copiar e colar isso em seu function.php, verá exatamente a mesma saída em suas postagens. Mas se você editar o código, poderá criar seu próprio.bem, ainda está lá na nova versão do wordpress a partir de 3.8 aqui está a correção que fiz para remover que usava o mesmo código acima, mas adicionei algumas linhas
fonte
add_filter( 'use_default_gallery_style', '__return_false' );
fonte