将NEXT/PREVICE_POSTS_LINK与自定义搜索配合使用

时间:2012-02-21 作者:turbonerd

我的网站上有一些不同的搜索:

“物种概况”(自定义帖子类型搜索)术语表(自定义帖子类型搜索)目前我正在使用search.php; $_POST["type"] 确定已使用的搜索,以及$_POST["s"] 对于查询条件:

<?php
    if (isset($_POST["s"])) {
        $search_term = $_POST["s"];
    }

    if (isset($_POST["type"])) {
        switch ($_POST["type"]) {
            case "profile" :
                $post_type = "species";
                break;
            case "glossary" :
                $post_type = "glossary";
                break;
            default :
                $post_type = array( \'post\', \'species\' );
                break;
        }
    } else {
        $post_type = array( \'post\', \'species\' );
    }

    $args = array(
        \'s\' => $search_term,
        \'post_type\' => $post_type
    );
?>

<?php get_template_part(\'searchresults\'); ?>
但是,当我尝试使用next_posts_linkprevious_posts_link, 它不起作用。URL更改为mywebsite.com/page/2/ 并显示Sorry, you\'re looking for something that isn\'t here 根据我的网站上的标准404发送消息。

<小时>EDIT 我现在已经更新了代码,使其包括$paged 如下(我也尝试过改变get_query_var\'paged\' 而不是\'page\' 但没什么区别):

    $paged = (get_query_var(\'page\')) ? get_query_var(\'page\') : 1;

    $args = array(
        \'s\' => $search_term,
        \'post_type\' => $post_type,
        \'paged\' => $paged
    );
然而,同样的问题也在发生。

以下是searchresults.php 对于@MarkDuncan

<?php global $args; ?>

<?php $query = new WP_Query ( $args ); ?>

<?php if ($query->have_posts()) : ?>

    <?php if ($s) : ?>
        <p class="info">Search results for <em>&#8216;<?php echo $s ?>&#8217;</em></p>
    <?php else : ?>
        <p class="info">Search results:</p>
    <?php endif; ?>

    <?php while ( $query->have_posts() ) : $query->the_post(); ?>
        <div class="post" id="post-<?php the_ID(); ?>">
            <?php
                if (get_post_type() == "species") {
                    get_template_part(\'list\', \'species\');
                } else {
                    get_template_part(\'list\', \'index\');
                }
            ?>
        </div>
    <?php endwhile; ?>

    <div class="navigation"><?php next_posts_link(\'&laquo; Previous Entries\') ?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<?php previous_posts_link(\'Next Entries &raquo;\') ?></div>

<?php else : ?>

    <?php get_template_part( \'notfound\' ); ?>

<?php endif; ?>
有没有办法解决这个问题?

提前感谢,

3 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您不需要类型变量和其他自定义搜索查询代码位,也不需要像其他答案那样的自定义函数。

在您的搜索框中,不要将表单提交给/提交给/my\\u post\\u type/而是!WordPress将自动为您处理其余的一切,无需任何努力。

What\'s more this means all the usual functions will work just as you expected them to!

例如,代替:

example.com/?type=species&s=giraffe
您可以执行以下操作:

example.com/species/?s=giraffe
其中示例。com/species是您的自定义帖子类型存档页面。

对于特定物种的搜索框:

<form role="search" method="get" id="searchform" action="<?php echo home_url( \'/species/\' ); ?>">
如果您想要一个带有选项的单一搜索框,可以将home\\u url函数参数从“/物种/”更改为“/”,然后添加一个名为“post\\u type”的下拉框字段,其中包含您需要的不同值,例如:

<form role="search" method="get" id="searchform" action="<?php echo home_url( \'/species/\' ); ?>">
    <select name="post_type">
      <option value="">Sitewide</option>
      <option value="species">Species</option>
      <option value="Glossary">Glossary</option>
    </select>
这样做意味着没有自定义查询,也没有对变量的敷衍。所有的功能都是由WordPress提供的,您需要做的唯一额外的部分就是更改您的搜索框html!

All the normal wordpress functions on archive pages will now work as expected with no additional steps

您可以对类别、标记、分类法、作者和日期存档使用相同的技巧。

因此,请删除搜索模板中的WP\\u查询,并删除搜索中放置在get\\u template\\u part行上方的额外代码。php,更改搜索框,并确保已激活自定义永久链接

SO网友:Rob Vermeer

因为您正在使用<?php $query = new WP_Query ( $args ); ?> wp\\U查询全局未更改(由next\\u posts\\u链接使用)。

因此,您可以将新的WP\\u查询调用更改为query_posts( $args ); (并在没有$query->).

或者您可以覆盖<?php global wp_query; $wp_query = new WP_Query ( ); $wp_query->query($args); ?> 并相应地更改循环($quey->$wp->query).

如果要在搜索后使用原始查询,可以在更改之前将其存储在临时变量中global $wp_query; $temp = $wp_query;. 循环之后,您可以执行以下操作$wp_query = $temp 将其设置回原始查询。

SO网友:Webord

我想说,实现这种链接的最快方法是:

function custom_next_comments_link( $label = \'\', $max_page = 0, $query = array() ) {
    global $wp_query;
    $wp_query = $query;
    echo get_next_comments_link( $label, $max_page );
}

function custom_previous_comments_link( $label = \'\', $query = array() ) {
    global $wp_query;
    $wp_query = $query;
    echo get_previous_comments_link( $label );
}
你会把他们当作$query 使用new WP_Query();

希望我能帮上忙。

结束