Wie behebe ich den WordPress-Galerie-Code manuell mit PHP in functions.php?

Es wurde schon oft darüber gesprochen, dass WordPress wirklich schlechten Code für die eingebaute Galeriefunktion ausgibt.

Dies ist der corecode, 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 = "  #{$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; }  "; $size_class = sanitize_html_class( $size ); $gallery_div = "\n"; return $output; } 

Was ich reparieren möchte?

[1] Der obige Code gibt css style direkt in den Post aus. Ich möchte damit aufhören, da ich einfach den gleichen CSS-Code in mein style.css-Stylesheet einfügen kann.

[2] Ich möchte den Code deaktivieren, um Bildtitel unter ihren Miniaturansichten auszugeben. Ich möchte, dass die Beschriftungen nur auf den Anhangseiten und nicht auf dem Post angezeigt werden.

[3] Der oben erwähnte Code fügt nach dem Galerie-Code zwei
Elemente hinzu. Ich möchte das auch deaktivieren, da ich dafür “rand” im css code verwenden kann.

Ich möchte die obigen “DREI” Dinge mit etwas PHP-Code in der functions.php Datei erreichen, da das Editieren der Core-Dateien nicht empfohlen wird.

Hoffe, dass jemand eine Hilfe sein kann. (Ich weiß nicht, wie ich programmieren soll, also bitte sei so klar wie möglich.) Danke!

RELEVANT: Die zu betrachtende /wp-includes/media.php ist /wp-includes/media.php (hier ist die Trunk-Version – suche die gallery_shortcode function).

Solutions Collecting From Web of "Wie behebe ich den WordPress-Galerie-Code manuell mit PHP in functions.php?"

Wie schon erwähnt, bevor man den shortcode löscht und neu hinzufügt, ist es nicht kompatibel mit anderen Plugins, die Galerien modifizieren. Stattdessen benutzt man den post_gallery Filter Hook und den gleichen Code aus der gallery_shortcode function, aber mit eigenen Modifikationen, die ich zum Beispiel kommentiert habe aus den Teilen, die du nicht willst:

 function fix_my_gallery_wpse43558($output, $attr) { global $post; static $instance = 0; $instance++; /** * will remove this since we don't want an endless loop going on here */ // Allow plugins/themes to override the default gallery template. //$output = apply_filters('post_gallery', '', $attr); // 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 ) ) /** * this is the css you want to remove * #1 in question */ /* $gallery_style = "  "; */ $size_class = sanitize_html_class( $size ); $gallery_div = "\n"; */ $output .= "\n"; return $output; } add_filter("post_gallery", "fix_my_gallery_wpse43558",10,2); 

Sehen Sie sich bellearner ‘s Bearbeiten unten an

Sie können den Standard-Shortcode entfernen und Ihren eigenen erstellen. Wie so (in deiner functions.php):

 remove_shortcode( 'gallery' ); function my_own_gallary() { // Gallery code } add_shortcode( 'gallery' , 'my_own_gallary' ); 

Der einfachste Weg, den Shortcode zu ändern, besteht darin, ihn in die functions.php my_own_gallary und die function so zu ändern, dass er wie my_own_gallary und mit der Bearbeitung beginnt.


BEARBEITEN

In den Kommentaren wurde darauf hingewiesen, dass es einen Filter für den Gallerie-Shortcode gibt, so dass der Shortcode nicht entfernt werden muss.

Beispiel, das Sie in Ihrer functions.php verwenden können (Ausgabe ist als Standard-Galerie-Shortcode, so dass Sie es ändern können).

 function my_own_gallery($output, $attr) { global $post; static $instance = 0; $instance++; // 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 = "  "; $size_class = sanitize_html_class( $size ); $gallery_div = "\n"; return $output; } add_filter("post_gallery", "my_own_gallery",10,2); 

Erklärung: Im von WordPress definierten Shortcode siehst du:

 $output = apply_filters('post_gallery', '', $attr); if ( $output != '' ) return $output; 

Dies bedeutet, dass wenn ein Filter angewendet wird und etwas zurückgibt, dieser verwendet (zurückgegeben) wird, ansonsten wird die function fortgesetzt (Standard-Shortcode).

Um einen Filter hinzuzufügen, verwenden Sie die function add_filter . Das erste Argument ist das Tag des Filters (in diesem Fall ‘post_gallery’), das zweite die hinzuzufügende function (die function, die Ihre benutzerdefinierte Galerie-Ausgabe zurückgibt).

Also wird “test” für den shortcode [gallery] ausgegeben:

 function my_own_gallery($output, $attr) { return 'test'; } add_filter("post_gallery", "my_own_gallery",10,2); 

In meinem Beispiel unten sehen Sie den add_filter, um den Standard-Shortcode mit Ihrem eigenen editierbaren Code zu erstellen. Sie können dies bearbeiten oder von Grund auf neu starten.


( EDIT von Otto: Das Obige wurde nun von Otto behoben. @RobVermeer hat den ersten Parameter zum Filter vermisst und den add_filter nicht richtig gemacht. Der post_gallery Filter ist der richtige Weg dies zu tun. es hinzuzufügen (wie von Badlearner unten versucht) ist nicht ratsam, da es mit anderen Plugins inkompatibel ist, die auch Galerien modifizieren.)


Hinzugefügt / Bearbeitet von badlearner :

Die Filtermethode zum Ändern des Galerie-Codes (in /wp-includes/media.php) unter Verwendung von functions.php, wie von @RobVermeer bereitgestellt, scheint nicht richtig zu funktionieren (siehe die Kommentare dieser Antwort).

Aber @ RobVermeers erste Antwort (dh vor der ersten Bearbeitung), die den Galerien-Shortcode abmeldet und einen neuen Galerie-Shortcode registriert, hat funktioniert. Und hier ist der Code, und bitte zögern Sie nicht, eine Antwort zu bearbeiten oder hinzuzufügen, wenn es einen besseren Weg gibt .

Der folgende Code muss in der Datei functions.php des Themes hinzugefügt werden:

 < ?php remove_shortcode( 'gallery' ); add_shortcode( 'gallery' , 'my_own_gallary' ); function my_own_gallary($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 = " "; $size_class = sanitize_html_class( $size ); $gallery_div = "\n"; return $output; } ?> 

Nun, es ist immer noch dort in der neuen Version von WordPress ab 3.8 heres die Korrektur, die ich gemacht habe, um das zu entfernen, benutzte den gleichen Code oben, fügte aber ein paar Zeilen hinzu

 remove_shortcode( "gallery" ); add_shortcode( "gallery" , "my_own_gallary" ); function my_own_gallary( $attr ) { global $post; static $instance = 0; $instance++; $output = apply_filters('post_gallery', '', $attr); if ( $output != '' ) { return $output; } 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 = " "; $size_class = sanitize_html_class( $size ); $gallery_div = "\n"; return $output; } 

add_filter( 'use_default_gallery_style', '__return_false' );