it-swarm.com.de

wie kann der Galerie-Shortcode eine einzige UL-Liste anstelle mehrerer DLs ausgeben?

Ich benötige den eingebauten Galerie-Shortcode, um UL anstelle von DL auszugeben. Wie kann ich es tun? Ich weiß, dass ich den Filter 'post_gallery' verwenden kann, aber das bedeutet, dass die gallery_shortcode-Funktion des Mediums fast dupliziert wird. Ich würde gerne eine weniger ausführliche Lösung finden.

Vielen Dank

3
Luca Reghellin

Ok, also habe ich die Galerie-Shortcode-Funktion umgeschrieben, indem ich das Original kopiert und entfernt/hinzugefügt/geändert habe, was ich brauchte, und jetzt teile ich es mit Ihnen. Die wichtigsten Dinge, die ich hinzugefügt/geändert habe, sind:

  • Eine einzelne UL/LI-Liste pro Galerie anstelle eines DL für jeden verdammten Gegenstand.
  • 'Itemtag' attr entfernt, da es keinen Sinn macht, ein anderes Tag für Elemente innerhalb einer UL zu verwenden
  • 'icontag' ist jetzt standardmäßig 'figure', 'captiontag' ist jetzt standardmäßig 'p'
  • new 'class' attr zum Hinzufügen einer benutzerdefinierten Klasse zum Container-UL
  • Neue Hilfsklassen "Erste Zeile", "Letzte Zeile", "Erste Zeile" und "Letzte Zeile" für LI-Elemente (obwohl ich dringend empfehle, stattdessen CSS-Selektoren für n-te untergeordnete Elemente zu verwenden )

Hier ist der Code:

//remove styles: I'll use mine
add_filter('use_default_gallery_style','__return_false');


//remove default shortcode
remove_shortcode('gallery');
//add new shortcode
add_shortcode('gallery', 'custom_gallery');

function custom_gallery($attr) {
  $post = get_post();

  static $instance = 0;
  $instance++;

  if(!empty($attr['ids'])){
    // 'ids' is explicitly ordered, unless you specify otherwise.
    if(empty($attr['orderby'])){ $attr['orderby'] = 'post__in'; }
    $attr['include'] = $attr['ids'];
  }

  $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 ? $post->ID : 0,
    'icontag'    => 'figure',
    'captiontag' => 'p',
    'columns'    => 3,
    'size'       => 'thumbnail',
    'include'    => '',
    'exclude'    => '',
    'link'       => '',
    'class'      => ''//now you can add custom class to container UL 
  ), $attr, 'gallery'));

  $id = intval($id);

  if('Rand' == $order) $orderby = 'none';

  if(!empty($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)){
    $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() ) //removed, see original in media.php


  $itemtag = tag_escape('li');//new tag for item 
  $captiontag = tag_escape($captiontag);
  $icontag = tag_escape($icontag);

  //valid tags check removed, see original in media.php

  $columns = intval($columns);
  $selector = "gallery-{$instance}";

  $size_class = sanitize_html_class( $size );

  //new tag for container 
  $output = "<ul id='$selector' class='gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class} {$class}'>";

  $i = 0;
  $c = count($attachments);
  $o = (int)floor($c/$columns)*$columns;

  foreach ( $attachments as $id => $attachment ) {
    if(!empty($link) && 'file' === $link) $image_output = wp_get_attachment_link($id,$size,false,false);
    elseif(!empty($link) && 'none' === $link) $image_output = wp_get_attachment_image($id,$size,false);
    else $image_output = wp_get_attachment_link( $id, $size, true, false );
    $image_meta = wp_get_attachment_metadata($id);
    $orientation = '';
    if(isset($image_meta['height'], $image_meta['width'])) $orientation = ($image_meta['height'] > $image_meta['width']) ? 'portrait' : 'landscape';

    //setup custom aux classes to help style
    $m = ++$i % $columns;
    $item_pos_class = ($m == 1) ? 'first-in-row' : (($m == 0) ? 'last-in-row' : '');
    $row_class = ($i <= $columns) ? 'first-row' : (($i > $o) ? 'last-row' : '');

    //added: custom aux classes
    $output .= "<{$itemtag} class='gallery-item {$item_pos_class} {$row_class}'>";
    $output .= "<{$icontag} class='gallery-icon {$orientation}'>$image_output</{$icontag}>";
    if($captiontag && trim($attachment->post_excerpt)){
      $output .= "<{$captiontag} class='wp-caption-text gallery-caption'>" . wptexturize($attachment->post_excerpt) . "</{$captiontag}>";
    }
    $output .= "</{$itemtag}>";
  }

  //changed BR>clear:both with a more conventional clearfix div
  $output .= "</ul>\n<div class='clearfix'></div>";

  return $output;
}//end custom gallery

Und um den Galerie-Shortcode "Kapitel" zu vervollständigen, zeige ich Ihnen hier, wie Sie die Standard- und/oder benutzerdefinierten Attribute eventuell programmgesteuert ändern können. Angenommen, ich muss die Größenangabe basierend auf der Anzahl der Artikel ändern:

add_filter('shortcode_atts_gallery','set_gallery_thumbs_size',10,3);

function set_gallery_thumbs_size($out, $pairs, $atts) {

  //in this case, if size was defined by the user, keep original and stop here
  if(isset($atts['size'])) return $out;

  //get number of images
  $c = count(explode(',',$atts['ids']));
  //set different sizes based on items count
  //new sizes were created with add_image_size() and image_size_names_choose filter (see wp docs)
  $atts['size'] = ($c > 2) ? 'thumb-3c' : ( ($c > 1) ? 'thumb-2c' : 'thumbnail');
  //merge original array with new one and return it
  return array_merge($out,$atts);
}

Hoffe, es wird anderen Menschen helfen, die nach einem saubereren Galerie-Markup suchen.

3
Luca Reghellin

Sie können die folgenden Attribute für den Galerie-Shortcode verwenden:

[gallery itemtag="ul" icontag="li" captiontag="li"]

Das Problem dabei ist, dass der Galerie-Shortcode das Bild und die Beschriftung in verschiedene Elemente einschließt (daher wird standardmäßig dl-dt-dd verwendet), sodass ein li-Element für das Bild und eines für die Beschriftung generiert wird. Sie können es dennoch mit CSS formatieren, da beide Elemente eindeutige Klassennamen haben.

3
passatgt