get_posts custom paging

时间:2017-07-26 作者:Josh Rodgers

我使用附件创建了对我的网站的搜索。每个附件都属于“图片”类别,因此我的搜索表单如下所示:

<form method="get" id="searchform" action="<?php bloginfo(\'url\'); ?>">
    <input type="text" name="s" id="s" value="Search..." onfocus="if (this.value==\'Search...\') this.value=\'\';" onblur="if (this.value==\'\') this.value=\'Search...\';" />
    <?php
        $parent = get_cat_ID("Pictures");
    ?>
    <input type="hidden" name="cat" value="<?php echo $parent; ?>" />
    <input type="submit" id="searchsubmit" value="" />
</form>
我的搜索结果页面search.php 通过get_posts查询我遇到的问题是分页。我可以限制页面上的帖子数量,甚至返回分页,但当我单击分页链接时,页面不会显示。我在想,因为这些是附件,页面的设置有点不同,但我不知道url是什么样子。我当前的代码如下所示:

<?php
    $args = array(
        \'post_type\' => \'attachment\',
        \'numberposts\' => \'-1\',
        \'category_name\' => get_the_title()
    );
    $images = get_posts($args);
    if (!empty($images)) {
?>

    <?php
        $limit = 5;

        $total = count($images);
        $pages = ceil($total / $limit);
        $result = ceil($total / $limit);

        $current = isset($_GET[\'paged\']) ? $_GET[\'paged\'] : 1;
        $next = $current < $pages ? $current + 1 : null;
        $previous = $current > 1 ? $current - 1 : null;

        $offset = ($current - 1) * $limit;
        $images = array_slice($images, $offset, $limit)
    ?>

    <h4><span>Search</span> Results</h4>
    <ul class="category">
        <?php
            foreach ($images as $image) {
                $title = $image->post_title;
                $description = $image->post_content;
                $attachment_link = get_attachment_link( $image->ID );
        ?>
            <li>
                <div class="col1">
                    <a href="<?php echo $attachment_link; ?>"><?php echo wp_get_attachment_image($image->ID, "medium"); ?></a>
                </div>
                <div class="col2">
                    <h5><?php echo $title; ?></h5>
                    <p><?php echo $description; ?></p>
                </div>
            </li>
        <?php } ?>
    </ul>

    <?php echo "<p>(Page: ". $current . " of " . $result .")</p>"; ?>
    <? if($previous): ?>
        <a href="<?php bloginfo(\'url\'); ?>?paged<?= $previous ?>">Previous</a>
    <? endif ?>
    <? if($next) : ?>
        <a href="<?php bloginfo(\'url\'); ?>?paged<?= $next ?>">Next</a>
    <? endif ?> 
<?php } ?>
分页是根据我在上找到的代码集成的:https://erikeldridge.wordpress.com/2009/01/11/simple-php-paging/

我离得太近了,可能只是在这里或那里稍作调整,有人能给我指出正确的方向吗?

谢谢,乔希

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

我找到了解决办法!

我安装了“搜索一切”插件(https://wordpress.org/plugins/search-everything/) 在插件设置中,我选择搜索所有类别和所有附件。

然后,在我的搜索结果页面上,我用paging参数查询帖子。我需要这个插件来搜索类别,因为媒体库中的每个图像都有类别,但这将返回所有类别的帖子,而不仅仅限于附件。因此,在我的查询中,我确保指定了附件帖子类型。

代码现在如下所示:

<?php
    $paged = (get_query_var("paged")) ? get_query_var("paged") : 1;
    query_posts($query_string."&post_type=attachment&posts_per_page=10&paged=".$paged);
    $count = $wp_query->found_posts; 
?>
    <h4><span>Search</span> Results</h4>
    <p align="center">We were able to find <?php if ($count == 1) $count .= " Image"; else $count .=" Images"; echo $count; //Image Count ?> for: "<?php the_search_query(); ?>"</p>
    <?php if ( have_posts() ) : ?>
        <ul class="category">
            <?php while ( have_posts() ) : the_post(); ?>
                <li>
                    <div class="col1">
                        <a href="<?php the_permalink(); ?>"><?php echo wp_get_attachment_image($image->ID, "medium"); ?></a>
                    </div>
                    <div class="col2">
                        <h5><?php the_title(); ?></h5>
                        <?php
                            $thumb = get_post(get_post_thumbnail_id()); // Get post by ID
                            echo \'<p>\'.$thumb->post_content.\'</p>\'; // Display Description
                        ?>
                    </div>
                </li>
            <?php endwhile; ?>
        </ul>
    <?php endif; ?>
    <?php echo "<p>(Page: ". $paged . " of " . $wp_query->max_num_pages .")</p>"; ?>
    <p><?php previous_posts_link( \'Previous\' ); ?></p>
    <p><?php next_posts_link( \'Next\', \'\' ); ?></p>
<?php wp_reset_query(); ?>
不确定“搜索一切”有什么不同之处,但这是可行的,并且具有正确的功能。我本想使用插件以外的东西,但这就完成了工作:-)

谢谢,乔希

SO网友:Mark Kaplun

您的问题是使用了核心url参数(paged 在本例中)对于不是主循环的内容。

有两种可能的解决方案

使用pre_get_posts 过滤以修改主循环。

使用您自己的分页参数(例如jr_paged).

结束

相关推荐

how to search everything

我们有一个使用BuddyPress、bbPress等的Wordpress内部网。。从…起this article, 我调整了主题searchform.php 包括:<input type=\"hidden\" name=\"post_type[]\" value=\"docs\" /> <input type=\"hidden\" name=\"post_type[]\" value=\"events\" /> <input type=\"hidden\" n