Es wurde oft darüber gesprochen, dass Wordpress einen wirklich schlechten Code für die eingebaute Galerie-Funktion ausgibt.
Dies ist der Kerncode, der für die Galerieausgabe verantwortlich ist (in /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;
}
Was möchte ich reparieren?
[1] Der obige Code gibt den CSS-Stil direkt in den Beitrag aus. Ich möchte damit aufhören, da ich auf einfache Weise denselben CSS-Code in mein style.css-Stylesheet einfügen kann.
[2] Ich möchte, dass der Code keine Bildunterschriften unterhalb der Miniaturbilder ausgibt. Ich möchte, dass die Bildunterschriften nur auf den Anhangsseiten und nicht im Beitrag angezeigt werden.
[3] Mit dem oben genannten Code werden zwei hinzugefügt<br style="clear: both;">
nach dem Galeriecode Elemente . Ich würde das auch gerne deaktivieren, da ich dafür "margin" im CSS-Code verwenden kann.
Ich möchte die oben genannten "DREI" Dinge mit etwas PHP-Code in der ausführen functions.php
Datei , da das Bearbeiten der Kerndateien nicht empfohlen wird.
Hoffe, jemand kann etwas helfen. (Ich weiß nicht, wie man codiert. Seien Sie also bitte so klar wie möglich.) Danke!
RELEVANT: Zu betrachtende Quelldatei ist /wp-includes/media.php
(hier ist die Trunk-Version - gallery_shortcode
Funktion suchen ).
Antworten:
Wie es vor dem Entfernen des Shortcodes und dem erneuten Hinzufügen erwähnt wurde, ist es nicht kompatibel mit anderen Plugins, die Galerien modifizieren. Stattdessen verwenden Sie den
post_gallery
Filter-Hook und denselben Code aus dergallery_shortcode
Funktion, aber mit Ihrer eigenen Modifikation zum Beispiel habe ich das auskommentiert Teile, die Sie nicht wollen:quelle
function my_own_gallery($output, $attr) { ...
Siehe die Bearbeitung des Badlearners weiter unten
Sie können den Standard-Shortcode entfernen und Ihren eigenen erstellen. Wie so (in deiner functions.php):
Die einfachste Möglichkeit, den Shortcode zu ändern, besteht darin, ihn in die Datei functions.php einzufügen und die Funktion so zu benennen, dass sie ungefähr so aussieht,
my_own_gallary
und mit der Bearbeitung zu beginnen.BEARBEITEN
Wie in den Kommentaren mit goldenen Punkten vermerkt: Es gibt einen Filter für den Galerie-Shortcode, sodass der Shortcode nicht erst entfernt werden muss.
Beispiel, das Sie in Ihrer functions.php verwenden können (die Ausgabe ist der Standard-Galerie-Shortcode, Sie können ihn also ändern).
Erklärung: In dem von WordPress definierten Shortcode sehen Sie:
Dies bedeutet, dass, wenn ein Filter angewendet wird und etwas zurückgibt, das verwendet wird (zurückgegeben), andernfalls die Funktion fortgesetzt wird (Standard-Shortcode).
Um einen Filter hinzuzufügen, verwenden Sie den add_filter Funktion . Das erste Argument ist das Tag des Filters (in diesem Fall 'post_gallery'), das zweite die hinzuzufügende Funktion (die Funktion, die Ihre benutzerdefinierte Galerieausgabe zurückgibt).
Das wird also "test" für den Shortcode [gallery] ausgeben:
In meinem Beispiel unten sehen Sie den add_filter, um den Standard-Shortcode mit Ihrem eigenen bearbeitbaren Code zu erstellen. Sie können dies bearbeiten oder von Grund auf neu beginnen.
( BEARBEITEN von Otto: Das oben Genannte wurde jetzt von Otto behoben. @RobVermeer hat den ersten Parameter des Filters nicht korrekt ausgeführt und den Filter add_filter nicht korrekt ausgeführt. Der Filter post_gallery ist der richtige Weg, um dies zu tun. Entfernen des Shortcodes und erneute Das Hinzufügen (wie von BadLearner unten versucht ) ist nicht ratsam, da es auch nicht mit anderen Plugins kompatibel ist, die Galerien modifizieren.)
Hinzugefügt / bearbeitet von badlearner :
Die Filtermethode zum Ändern des Galeriecodes (in /wp-includes/media.php) mithilfe von functions.php, wie sie von @RobVermeer bereitgestellt wird, scheint nicht richtig zu funktionieren (siehe die Kommentare dieser Antwort).
Die erste Antwort von @ RobVermeer (dh vor der ersten Bearbeitung), die die Registrierung des Galerie-Shortcodes aufhebt und einen neuen Galerie-Shortcode registriert, hat funktioniert. Und hier ist der Code und Sie können ihn gerne bearbeiten oder eine Antwort hinzufügen, wenn es einen besseren Weg gibt .
Der folgende Code muss in die Datei functions.php Ihres Themas eingefügt werden:
quelle
[gallery]
selbst oder was anderes?[my_own_gallery]
??[gallery]
tatsächlich. Wenn du kopierst, füge das in deine function.php ein und du siehst genau die gleiche Ausgabe in deinen Posts. Wenn Sie den Code jedoch bearbeiten, können Sie ihn selbst erstellen.Nun, es ist immer noch da in der neuen Version von WordPress ab Version 3.8. Hier ist das Update, das ich gemacht habe, um den gleichen Code wie oben zu entfernen, aber ein paar Zeilen hinzugefügt
quelle
add_filter( 'use_default_gallery_style', '__return_false' );
quelle