我假设你想要这样的东西:
|---------------------|
| 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_tag 和
add_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:
WP_Query
paginate_links
- Class WP/source/add_query_var
- Rewrite API
- add_rewrite_tag
- add_rewrite_rule
- Multiple WP_Query loops with Pagination
- How to create separate pagination for mutiple loops?
可选:
它所做的是更改第一个图像的默认链接。通常是这样http://site.ext/?p=123
或http://site.ext/post-name/
, 附件父母permalink。没关系,默认情况下,它会显示第一个图像<但是如果你想让第一幅图片的链接代表URL中的gallery query变量,你必须连接到paginate_links
. 这导致链接被这样构造http://site.ext/?p=123&gallery_page=1
或http://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?.