Sudah sering dibicarakan bahwa Wordpress mengeluarkan beberapa kode yang benar-benar buruk untuk fungsi galeri bawaan.
Ini adalah kode inti yang bertanggung jawab untuk output galeri (di /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;
}
Apa yang ingin saya perbaiki?
[1] Kode di atas menampilkan gaya css langsung ke pos. Saya ingin menghentikannya, karena saya dapat dengan mudah menambahkan kode css yang sama di stylesheet style.css saya.
[2] Saya ingin menonaktifkan kode dari menampilkan keterangan gambar di bawah thumbnail mereka. Saya ingin teks hanya ditampilkan di halaman lampiran, dan tidak di pos.
[3] Kode tersebut menambahkan dua <br style="clear: both;">
elemen setelah kode galeri. Saya juga ingin menonaktifkannya, karena saya dapat menggunakan "margin" dalam kode css untuk itu.
Saya ingin menyelesaikan hal-hal "TIGA" di atas menggunakan beberapa kode PHP dalam functions.php
file, karena mengedit file inti tidak dianjurkan.
Semoga seseorang dapat membantu. (Saya tidak tahu cara kode, jadi, mohon sejelas mungkin.) Terima kasih!
RELEVAN: File sumber untuk dilihat adalah /wp-includes/media.php
(ini versi trunk - cari gallery_shortcode
fungsinya).
Jawaban:
Seperti yang telah disebutkan sebelum menghapus kode pendek dan menambahkan kembali itu tidak kompatibel dengan plugin memodifikasi galeri lain jadi alih-alih Anda menggunakan
post_gallery
hook filter dan kode yang sama darigallery_shortcode
fungsi tetapi dengan modifikasi Anda sendiri misalnya, saya sudah berkomentar bagian yang tidak Anda inginkan:sumber
function my_own_gallery($output, $attr) { ...
Lihat hasil edit badlearner di bawah ini
Anda dapat menghapus kode pendek default dan membuat kode Anda sendiri. Seperti itu (di functions.php Anda):
Cara termudah untuk mengubah kode pendek adalah dengan menyalinnya di paste di functions.php Anda dan mengubah fungsi untuk nama untuk sesuatu seperti
my_own_gallary
dan mulai mengedit.EDIT
Seperti yang ditunjukkan oleh goldenapples di komentar: Ada filter untuk kode pendek galeri, jadi tidak perlu menghapus kode pendek terlebih dahulu.
contoh yang dapat Anda gunakan di functions.php Anda (output adalah sebagai shortcode galeri default, sehingga Anda dapat mengubahnya).
Penjelasan: Dalam kode pendek yang ditentukan oleh WordPress Anda akan melihat:
Ini berarti bahwa jika filter diterapkan dan mengembalikan sesuatu, itu akan digunakan (dikembalikan), jika tidak fungsi akan berlanjut (kode pendek default).
Untuk menambahkan filter, Anda menggunakan fungsi add_filter . Argumen pertama adalah tag filter (dalam hal ini 'post_gallery'), yang kedua adalah fungsi yang ditambahkan (fungsi yang akan mengembalikan output galeri kustom Anda).
Jadi ini akan menampilkan "tes" untuk shortcode [galeri]:
Dalam contoh saya edit di bawah ini Anda akan melihat add_filter untuk membuat shortcode default dengan kode Anda sendiri yang dapat diedit. Anda dapat mengedit ini, atau mulai dari bawah ke atas sesuka hati.
( EDIT oleh Otto: Di atas sekarang telah diperbaiki oleh Otto. @RobVermeer kehilangan parameter pertama ke filter dan tidak melakukan add_filter dengan benar. Filter post_gallery adalah cara yang benar untuk melakukan ini. Menghapus shortcode dan kembali menambahkannya (seperti yang dicoba oleh badlearner di bawah) tidak disarankan karena tidak kompatibel dengan plugin lain yang memodifikasi galeri juga.)
Ditambahkan / Diedit oleh badlearner :
Metode filter untuk memodifikasi kode galeri (di /wp-includes/media.php) menggunakan functions.php, seperti yang disediakan oleh @RobVermeer tampaknya tidak berfungsi dengan baik (lihat komentar jawaban ini).
Tapi jawaban pertama @ RobVermeer (yaitu, sebelum edit pertama), yang membatalkan registrasi kode pendek galeri dan mendaftarkan kode pendek galeri baru, berfungsi. Dan ini kodenya, dan Silakan mengedit atau menambahkan jawaban jika ada cara yang lebih baik .
Berikut ini adalah kode yang perlu ditambahkan dalam file functions.php tema Anda:
sumber
[gallery]
itu sendiri atau sesuatu yang lain?[my_own_gallery]
??[gallery]
memang. Jika Anda menyalin, tempel ini di function.php Anda akan melihat output yang persis sama di posting Anda. Tetapi jika Anda mengedit kode Anda dapat membuatnya sendiri.baik itu masih ada di versi baru wordpress pada 3,8 inilah perbaikan yang saya buat untuk menghapus yang menggunakan kode yang sama di atas tetapi menambahkan beberapa baris
sumber
add_filter( 'use_default_gallery_style', '__return_false' );
sumber