如何将二次查询中的附件作为图库进行分页?

时间:2013-11-22 作者:artist learning to code

我有这个代码,显示所有附加到我的帖子类型的图像。有没有办法把它们分页?我有25张照片,我想尽量避免滚动。

代码:

<div class="galleries ten columns">
<?php
    $attachments = get_posts( array( 
   \'post_type\' => \'attachment\',
   \'post_mime_type\'=>\'image\',
   \'posts_per_page\' => -1,
   \'post_status\' => \'any\',
   \'post_parent\' => $post->ID)
);
if ( $attachments ) {
foreach ( $attachments as $attachment ) {
    $src = wp_get_attachment_image_src( $attachment->ID, full);     
    $html = \'<a class="fancybox" href="\'.$src[0].\'">\';
    $html .= wp_get_attachment_image( $attachment->ID, \'gallery-thumb\') .\'</a>\';
    echo $html;
}
}
?>
</div>
谢谢!

1 个回复
最合适的回答,由SO网友:Nicolai Grossherr 整理而成

我假设你想要这样的东西:

|---------------------|   
|       content       |  
|       (static)      |  
|---------------------|  
|       gallery       |  
|       (paged)       |  
|---------------------|  
|   << pagelinks >>   |  
|---------------------|  
在这个设置中,您的贴子内容保持不变,显示为静态,而库被分页。这意味着您有一个主查询,向您显示标题、内容等,还有一个辅助查询,负责向您显示库图像。此页面上的页面链接连接到辅助循环,并在那里进行分页。为此,我建议使用WP_Query 而不是get_posts(), 这不仅是因为我心中没有解决后者的办法,而且因为我认为这通常是更好的办法。在第一步中,您必须设置一个新的查询变量,该变量将用于分页。功能add_gallery_query_var() 进入您的functions.php.

Code:

    add_filter(\'init\', \'wpse124169_attachment_gallery_add_query_var\');
    function wpse124169_attachment_gallery_add_query_var() {
        global $wp;
        $wp->add_query_var(\'gallery_page\');
    }
此外,如果您想让permalinks处理新的查询变量,必须实现新的重写规则。为此,请将以下内容添加到functions.php, 它利用add_rewrite_tagadd_rewrite_rule.

Code:

    add_filter(\'init\', \'wpse124169_attachment_gallery_add_rewrite_tag_rule\');
    function wpse124169_attachment_gallery_add_rewrite_tag_rule() {
        add_rewrite_tag(\'%gallery_page%\',\'([^&]+)\');
        add_rewrite_rule(\'([^/]+)/gallery/image//?([0-9]{1,})/?$\', \'index.php?name=$matches[1]&gallery_page=$matches[2]\', \'top\');
    }
下一步是为库创建二次循环。WP_Query 用于执行此操作,另外paginate_links 使我们能够创建链接,以便在库中分页。我决定为此创建一个函数,因此下面的代码将进入functions.php.

Code:

function wpse124169_get_attachment_gallery() {
    global $post;
    $gallery_page = (get_query_var(\'gallery_page\')) ? get_query_var(\'gallery_page\') : 1;
    $args = array(
        \'posts_per_page\' => 1, 
        \'orderby\' => \'menu_order\', 
        \'order\' => \'ASC\', 
        \'post_type\' => \'attachment\',
        \'post_status\' => \'inherit\', 
        \'post_mime_type\' => \'image\', 
        \'post_parent\' => $post->ID, 
        \'paged\' => $gallery_page
    ); 
    $gallery = new WP_Query($args);
        if ( $gallery->have_posts() ) :
            echo \'<div class="my_cpt_gallery_paged">\';
                    while ( $gallery->have_posts() ) : $gallery->the_post();
                        echo wp_get_attachment_image( $post->ID, \'medium\' );
                    endwhile;
            echo \'</div>\';
            echo \'<div class="my_cpt_gallery_paginate_links">\';
                    if ( get_option(\'permalink_structure\') ) {
                        $format = \'gallery/image/%#%\';
                    } else {
                        $format = \'&gallery_page=%#%\';
                    }
                    $args = array(
                        \'base\' => get_permalink( $post->post_parent ) . \'%_%\',
                        \'format\' => $format,
                        \'current\' => $gallery_page,
                        \'total\' => $gallery->max_num_pages
                    );
                    echo paginate_links( $args );
                    wp_reset_postdata();
            echo \'</div>\';
        endif;
}
如您所见,辅助查询使用了一个额外的post对象-$gallery - 和之前定义的查询变量-gallery_page - 启用正确分页。后者用于设置format 的参数paginate_links(). 我们不应该忘记重置-wp_reset_postdata() - 防止出现问题。当然,这只是二次循环,而不是完整的模板。

我在中调用辅助附件库查询single.php, 在主查询/循环之后,通过函数wpse124169_get_attachment_gallery(). 按照上述步骤,您已设置分页附件库。我已经测试了这个,它对我有效。




下面我列出了最重要的信息和来源,如果你对更多的细节感兴趣,这应该会让你比刚刚开始的更多。

Information:

  1. WP_Query
  2. paginate_links
  3. Class WP/source/add_query_var
  4. Rewrite API
  5. add_rewrite_tag
  6. add_rewrite_rule
  7. Multiple WP_Query loops with Pagination
  8. How to create separate pagination for mutiple loops?



可选:

它所做的是更改第一个图像的默认链接。通常是这样http://site.ext/?p=123http://site.ext/post-name/, 附件父母permalink。没关系,默认情况下,它会显示第一个图像<但是如果你想让第一幅图片的链接代表URL中的gallery query变量,你必须连接到paginate_links. 这导致链接被这样构造http://site.ext/?p=123&gallery_page=1http://site.ext/post-name/gallery/image/1. 这仅适用于通过以下链接进行导航:paginate_links(), 调用父post只会显示相应的父permalink。代码也将进入functions.php.

Code:

add_filter( \'paginate_links\', \'wpse124169_attachment_gallery_first_image_link\' );
function wpse124169_attachment_gallery_first_image_link( $link ) {
    global $post;
    if ( get_option(\'permalink_structure\') ) {
        $gpg_num = substr( strrchr( $link, \'/\' ), 1 );
    } else {
        $gpg_plk = wp_parse_args($link);
        $gpg_num = $gpg_plk[\'gallery_page\'];
    }
    if ( empty( $gpg_num ) ) {
        if ( get_option(\'permalink_structure\') ) {
            $link = get_permalink( $post->post_parent ) . \'gallery/image/1\';
        } else {
            $link = get_permalink( $post->post_parent ) . \'&gallery_page=1\';
        }
    }

    return $link;
}



Update:

这可用于更改[库]短代码,如下所示:How to paginate wordpress [gallery] shortcode?.

结束

相关推荐

Pagination for user list

我使用get_user() 作用但我需要把结果分页。我试了很多,但没有成功。下面是代码,它没有按预期工作:$args = array( \'meta_query\' => array( array( \'key\' => \'ib_s2member_custom_fields\', \'value\' => trim($_GET[\"country\"]), \'compare\' => \