如何从插件定制可湿性粉剂图片库快捷代码的输出?

时间:2010-11-20 作者:jnthnclrk

我们正在构建一个显示帖子的插件,我们还希望在帖子中使用图像库时显示它。但是,我们需要限制显示的照片数量?这可能吗?

2 个回复
最合适的回答,由SO网友:t31os 整理而成

有两种方法可以实现这一点,但都需要创建一个与现有gallery shortcode函数功能基本相同的函数。。。

你可以选择。。

钩住post_gallery 并操作传入的数据(如有必要,您可以使用gallery shortcode函数作为过滤器的基础)

  • 取消注册gallery shortcode并注册新的gallery shortcode(如有必要,您也可以使用现有函数作为基础)
    1. 我在this thread, 我之所以提到它,是因为我将对下面的例子采用相同的方法。

      库短代码的过滤器示例

      add_filter( \'post_gallery\', \'my_post_gallery\', 10, 2 );
      function my_post_gallery( $output, $attr) {
          global $post, $wp_locale;
      
          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}";
      
          $output = apply_filters(\'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 -->
              <div id=\'$selector\' class=\'gallery galleryid-{$id}\'>");
      
          $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=\'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;
      }
      
      修改该函数以施加任何您喜欢的限制(这只是一个基础)。。

      你可以找到我用的钩子wp-includes/media.php 在gallery shortcode回调函数中(请参见第763行)。

      http://core.trac.wordpress.org/browser/tags/3.0.1/wp-includes/media.php#L745

      希望有帮助:)

    SO网友:hakre

    您可以指定每个库的图像数。这可以通过post editor中media thickbox中的gallery选项卡进行配置。插入图库后,我想您可以通过在可视化编辑器中编辑图库来编辑它。

    结束

    相关推荐

    How do you debug plugins?

    我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?