用自定义图库快捷代码覆盖WordPress图库

时间:2019-11-03 作者:sialfa

我想用自定义的短代码覆盖默认的WordPress gallery短代码。这是因为我需要添加一个字段,该字段将包含我要在库中添加的每个图像的url。我不确定如何继续,但现在我编写了这个代码原型,我想用于短代码,我不确定如何继续用于自定义链接字段。此外,我还需要了解如何打开媒体库模式以多选图像并添加到快捷码id param,图像的各种ID及其相对链接。如有任何建议或帮助,将不胜感激。


function custom_gallery( $atts ){
  extract(shortcode_atts(\'id\' => \'\',\'links\' => \'\')); 
  // here I need to implement code for link and image selection
}
add_shortcode( \'gallery\', \'custom_gallery\');


1 个回复
SO网友:Howdy_McGee

Gallery Shortcode Callback 是一个过滤器挂钩:post_gallery

如果此过滤器返回任何非空/非null输出,则短代码将使用该输出,而不是默认生成。您可以复制Gallery Shortcode Callabck 并根据需要进行修改。

下面是一个过滤器挂钩,使用gallery回调的整个代码post_gallery 过滤器挂钩已拆除,以防止任何无限循环。

/**
 * Custom Gallery Function for custom output
 * 
 * @param string $output   The gallery output. Default empty.
 * @param array  $attr     Attributes of the gallery shortcode.
 * @param int    $instance Unique numeric ID of this gallery shortcode instance.
 *
 * @return String $output
 */
function my_custom_gallery( $output, $attr, $instance ) {

    $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\'];
    }

    $html5 = current_theme_supports( \'html5\', \'gallery\' );
    $atts  = shortcode_atts(
            array(
                    \'order\'      => \'ASC\',
                    \'orderby\'    => \'menu_order ID\',
                    \'id\'         => $post ? $post->ID : 0,
                    \'itemtag\'    => $html5 ? \'figure\' : \'dl\',
                    \'icontag\'    => $html5 ? \'div\' : \'dt\',
                    \'captiontag\' => $html5 ? \'figcaption\' : \'dd\',
                    \'columns\'    => 3,
                    \'size\'       => \'thumbnail\',
                    \'include\'    => \'\',
                    \'exclude\'    => \'\',
                    \'link\'       => \'\',
            ),
            $attr,
            \'gallery\'
    );
    $id = intval( $atts[\'id\'] );
    if ( ! empty( $atts[\'include\'] ) ) {
            $_attachments = get_posts(
                    array(
                            \'include\'        => $atts[\'include\'],
                            \'post_status\'    => \'inherit\',
                            \'post_type\'      => \'attachment\',
                            \'post_mime_type\' => \'image\',
                            \'order\'          => $atts[\'order\'],
                            \'orderby\'        => $atts[\'orderby\'],
                    )
            );
            $attachments = array();
            foreach ( $_attachments as $key => $val ) {
                    $attachments[ $val->ID ] = $_attachments[ $key ];
            }
    } elseif ( ! empty( $atts[\'exclude\'] ) ) {
            $attachments = get_children(
                    array(
                            \'post_parent\'    => $id,
                            \'exclude\'        => $atts[\'exclude\'],
                            \'post_status\'    => \'inherit\',
                            \'post_type\'      => \'attachment\',
                            \'post_mime_type\' => \'image\',
                            \'order\'          => $atts[\'order\'],
                            \'orderby\'        => $atts[\'orderby\'],
                    )
            );
    } else {
            $attachments = get_children(
                    array(
                            \'post_parent\'    => $id,
                            \'post_status\'    => \'inherit\',
                            \'post_type\'      => \'attachment\',
                            \'post_mime_type\' => \'image\',
                            \'order\'          => $atts[\'order\'],
                            \'orderby\'        => $atts[\'orderby\'],
                    )
            );
    }
    if ( empty( $attachments ) ) {
            return \'\';
    }
    if ( is_feed() ) {
            $output = "\\n";
            foreach ( $attachments as $att_id => $attachment ) {
                    $output .= wp_get_attachment_link( $att_id, $atts[\'size\'], true ) . "\\n";
            }
            return $output;
    }
    $itemtag    = tag_escape( $atts[\'itemtag\'] );
    $captiontag = tag_escape( $atts[\'captiontag\'] );
    $icontag    = tag_escape( $atts[\'icontag\'] );
    $valid_tags = wp_kses_allowed_html( \'post\' );
    if ( ! isset( $valid_tags[ $itemtag ] ) ) {
            $itemtag = \'dl\';
    }
    if ( ! isset( $valid_tags[ $captiontag ] ) ) {
            $captiontag = \'dd\';
    }
    if ( ! isset( $valid_tags[ $icontag ] ) ) {
            $icontag = \'dt\';
    }
    $columns   = intval( $atts[\'columns\'] );
    $itemwidth = $columns > 0 ? floor( 100 / $columns ) : 100;
    $float     = is_rtl() ? \'right\' : \'left\';
    $selector = "gallery-{$instance}";
    $gallery_style = \'\';
    /**
     * Filters whether to print default gallery styles.
     *
     * @since 3.1.0
     *
     * @param bool $print Whether to print default gallery styles.
     *                    Defaults to false if the theme supports HTML5 galleries.
     *                    Otherwise, defaults to true.
     */
    if ( apply_filters( \'use_default_gallery_style\', ! $html5 ) ) {
            $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;
                    }
                    /* see gallery_shortcode() in wp-includes/media.php */
            </style>\\n\\t\\t";
    }
    $size_class  = sanitize_html_class( $atts[\'size\'] );
    $gallery_div = "<div id=\'$selector\' class=\'gallery galleryid-{$id} gallery-columns-{$columns} gallery-size-{$size_class}\'>";
    /**
     * Filters the default gallery shortcode CSS styles.
     *
     * @since 2.5.0
     *
     * @param string $gallery_style Default CSS styles and opening HTML div container
     *                              for the gallery shortcode output.
     */
    $output = apply_filters( \'gallery_style\', $gallery_style . $gallery_div );
    $i = 0;
    foreach ( $attachments as $id => $attachment ) {
            $attr = ( trim( $attachment->post_excerpt ) ) ? array( \'aria-describedby\' => "$selector-$id" ) : \'\';
            if ( ! empty( $atts[\'link\'] ) && \'file\' === $atts[\'link\'] ) {
                    $image_output = wp_get_attachment_link( $id, $atts[\'size\'], false, false, false, $attr );
            } elseif ( ! empty( $atts[\'link\'] ) && \'none\' === $atts[\'link\'] ) {
                    $image_output = wp_get_attachment_image( $id, $atts[\'size\'], false, $attr );
            } else {
                    $image_output = wp_get_attachment_link( $id, $atts[\'size\'], true, false, false, $attr );
            }
            $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\';
            }
            $output .= "<{$itemtag} class=\'gallery-item\'>";
            $output .= "
                    <{$icontag} class=\'gallery-icon {$orientation}\'>
                            $image_output
                    </{$icontag}>";
            if ( $captiontag && trim( $attachment->post_excerpt ) ) {
                    $output .= "
                            <{$captiontag} class=\'wp-caption-text gallery-caption\' id=\'$selector-$id\'>
                            " . wptexturize( $attachment->post_excerpt ) . "
                            </{$captiontag}>";
            }
            $output .= "</{$itemtag}>";
            if ( ! $html5 && $columns > 0 && ++$i % $columns == 0 ) {
                    $output .= \'<br style="clear: both" />\';
            }
    }
    if ( ! $html5 && $columns > 0 && $i % $columns !== 0 ) {
            $output .= "
                    <br style=\'clear: both\' />";
    }
    $output .= "
            </div>\\n";
            return $output;

}
add_filter( \'post_gallery\', \'my_custom_gallery\', 10, 3 );