最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

loop - Missing image in gallery shortcode in custom feed

programmeradmin0浏览0评论

I have problem with custom gallery shortcode and missing first image in each gallery block. For example: [gallery ids="1,2,3,4,5"] show only 2,3,4,5 pictures.

This custom shortcode is part of wordpress plugin which make custom feed. It works correctly on my second site with same plugins and theme (tested on localhost). I've tried to update whole wordpress installation, disabled all plugins with no success. So the problem is somewhere in db or with server? I'm do not have any idea how debug this strange behavior and need some advice please.

Custom gallery shortcode:

        add_shortcode('gallery', 'gallery_shortcode');
        add_filter( 'post_gallery', 'yturbo_gallery', 9999999, 2 );
        $content = do_shortcode($content);
        $content = yturbo_do_gallery($content);

        $ytad4meta = get_post_meta($post->ID, 'ytad4meta', true);
        $ytad5meta = get_post_meta($post->ID, 'ytad5meta', true);

    function yturbo_gallery( $output, $attr ) {

    $yturbo_options = get_option('yturbo_options');
    if ( ! is_feed($yturbo_options['ytrssname']) ) {return;}

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

    $atts['include'] = str_replace(array("»","″"), "", $atts['include']);
    $atts['orderby'] = str_replace(array("»","″"), "", $atts['orderby']);
    $atts['order'] = str_replace(array("»","″"), "", $atts['order']);
    $atts['exclude'] = str_replace(array("»","″"), "", $atts['exclude']);

    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'],'offset' => 0 ) );

        $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'],'offset' => 0 ) );
    } else {
        $attachments = get_children( array( 'post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'],'offset' => 0 ) );
    }

    if ( empty( $attachments ) ) {
        return '';
    }

    $output = PHP_EOL.'<div data-block="gallery">'.PHP_EOL;

        foreach ( $attachments as $id => $attachment ) {
            $output .= '<img src="'.wp_get_attachment_url($id) . '"/>'.PHP_EOL;
        }

    $output .= '</div>'.PHP_EOL;

    return $output;
}

I've tried to edit plugin code as it suggested here for gallery shortcode, but in this case both installations show all images except first.

    function yturbo_gallery( $output, $attr ) {

    $yturbo_options = get_option('yturbo_options');
    if ( ! is_feed($yturbo_options['ytrssname']) ) {return;}
    
    
    $output = "<div data-block=\"gallery\">";
    $posts = get_posts(array('include' => $attr['ids'],'post_type' => 'attachment'));

    foreach($posts as $imagePost){
        $output .= "<img src='".wp_get_attachment_image_src($imagePost->ID, 'full')[0]."'>";
    }

    $output .= "</div>";

    return $output; 
}

I've tested loops with 'offset' => 0 with no results.

I have problem with custom gallery shortcode and missing first image in each gallery block. For example: [gallery ids="1,2,3,4,5"] show only 2,3,4,5 pictures.

This custom shortcode is part of wordpress plugin which make custom feed. It works correctly on my second site with same plugins and theme (tested on localhost). I've tried to update whole wordpress installation, disabled all plugins with no success. So the problem is somewhere in db or with server? I'm do not have any idea how debug this strange behavior and need some advice please.

Custom gallery shortcode:

        add_shortcode('gallery', 'gallery_shortcode');
        add_filter( 'post_gallery', 'yturbo_gallery', 9999999, 2 );
        $content = do_shortcode($content);
        $content = yturbo_do_gallery($content);

        $ytad4meta = get_post_meta($post->ID, 'ytad4meta', true);
        $ytad5meta = get_post_meta($post->ID, 'ytad5meta', true);

    function yturbo_gallery( $output, $attr ) {

    $yturbo_options = get_option('yturbo_options');
    if ( ! is_feed($yturbo_options['ytrssname']) ) {return;}

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

    $atts['include'] = str_replace(array("&#187;","&#8243;"), "", $atts['include']);
    $atts['orderby'] = str_replace(array("&#187;","&#8243;"), "", $atts['orderby']);
    $atts['order'] = str_replace(array("&#187;","&#8243;"), "", $atts['order']);
    $atts['exclude'] = str_replace(array("&#187;","&#8243;"), "", $atts['exclude']);

    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'],'offset' => 0 ) );

        $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'],'offset' => 0 ) );
    } else {
        $attachments = get_children( array( 'post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $atts['order'], 'orderby' => $atts['orderby'],'offset' => 0 ) );
    }

    if ( empty( $attachments ) ) {
        return '';
    }

    $output = PHP_EOL.'<div data-block="gallery">'.PHP_EOL;

        foreach ( $attachments as $id => $attachment ) {
            $output .= '<img src="'.wp_get_attachment_url($id) . '"/>'.PHP_EOL;
        }

    $output .= '</div>'.PHP_EOL;

    return $output;
}

I've tried to edit plugin code as it suggested here for gallery shortcode, but in this case both installations show all images except first.

    function yturbo_gallery( $output, $attr ) {

    $yturbo_options = get_option('yturbo_options');
    if ( ! is_feed($yturbo_options['ytrssname']) ) {return;}
    
    
    $output = "<div data-block=\"gallery\">";
    $posts = get_posts(array('include' => $attr['ids'],'post_type' => 'attachment'));

    foreach($posts as $imagePost){
        $output .= "<img src='".wp_get_attachment_image_src($imagePost->ID, 'full')[0]."'>";
    }

    $output .= "</div>";

    return $output; 
}

I've tested loops with 'offset' => 0 with no results.

Share Improve this question asked Jan 19, 2021 at 20:30 NarNar 111 bronze badge 2
  • Have you checked that the IDs you've provided are actually attachments? – cameronjonesweb Commented Jan 19, 2021 at 20:49
  • loop has 'post_type' => 'attachment', so I think they are actually attachments – Nar Commented Jan 19, 2021 at 22:06
Add a comment  | 

1 Answer 1

Reset to default 0

The problem was in additional symbols &#8221 in $attr['ids'] array. So I've changed:

$atts['include'] = str_replace(array("&#187;","&#8243;","&#8221;"), "", $atts['include']);
$atts['orderby'] = str_replace(array("&#187;","&#8243;","&#8221;"), "", $atts['orderby']);
$atts['order'] = str_replace(array("&#187;","&#8243;","&#8221;"), "", $atts['order']);
$atts['exclude'] = str_replace(array("&#187;","&#8243;","&#8221;"), "", $atts['exclude']);

And now everything ok.

发布评论

评论列表(0)

  1. 暂无评论