用于从搜索查询中获取相邻帖子的SQL查询

时间:2015-01-15 作者:Pieter Goosen

我很忙rewritting a custom function 我最近写了一篇文章,根据URL中保存的标签、类别、自定义分类术语、作者或搜索值来获取相邻的帖子

我使用的是get_adjacent_post 重写我的函数。

这是我的。这将成功检索相邻帖子的ID,并根据query_vars 在URL中设置。如果没有自定义query_vars 设置后,函数将按正常的时间顺序获取相邻的帖子

<?php    
function get_adjacent_include_referred_post( $previous = true ) {
    global $wpdb;

    if ( ( ! $post = get_post() ) )
        return null;

    $current_post_date = $post->post_date;

    $join = \'\';
    $where = \'\';

    //Alter the SQL query if \'aq\' is set in single page URL
    if( is_author_referrer() ) {

        $author = $_GET[\'aq\'];
        $where .= $wpdb->prepare( "AND p.post_author IN (%s)", $author );

    }

    //Alter the SQL query if \'tq\' is set in single page URL
    if( is_tax_referrer() ) {

        $term = $_GET[\'tq\'];
        $join = $wpdb->prepare( " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id  AND tr.term_taxonomy_id IN (%s)", $term );

    }

    //Alter the the SQL query if sq is set in single page URL
    if( is_search_referrer() ) {

        $term = $_GET[\'sq\'];
        // **MISSING INFO** 
    }


    //Set next and previous post\'s operators to form the SQL query
    $adjacent   = $previous ? \'previous\' : \'next\';
    $op         = $previous ? \'<\' : \'>\';
    $order      = $previous ? \'DESC\' : \'ASC\';

    // Setting the default clauses to build the custom SQL query to get adjacent post
    $where = $wpdb->prepare( "WHERE p.post_date $op %s AND p.post_type = %s AND p.post_status = \'publish\' $where", $current_post_date, $post->post_type );
    $sort  = "ORDER BY p.post_date $order LIMIT 1";
    $query = "SELECT p.ID FROM $wpdb->posts AS p $join $where $sort";

    //Create and set cache to improve performance of the function
    $query_key = \'get_the_adjacent_post_\' . md5( $query );
    $result = wp_cache_get( $query_key, \'counts\' );

    $result = $wpdb->get_var( $query );
    if ( null === $result )
        $result = \'\';

    wp_cache_set( $query_key, $result, \'counts\' );

    return $result;

}
我的问题是,我找不到任何可以用于搜索查询的东西(我的SQL知识太差,无法组装有用的东西)。如果我的搜索查询是rocks 如果有人点击了一篇文章,如何调整我的SQL查询以从同一搜索查询中查看的当前单篇文章中获取相邻的文章?

关于我的代码的几点注释is_***_referrer() 条件检查是包装函数,用于检查S_GET[\'***\'] 已设置。对于搜索查询,is_search_referrer() 检查是否$_GET[\'sq\'] 如果query_vars 存在,失败时为false

的值$_GET[\'sq\'] will是的价值get_search_query(). 这是用于获取同一搜索查询的相邻帖子的值

我的代码中没有语法错误,可以正常工作。我知道出于某种原因,上面的代码块中的代码看起来很有趣,从中可以看出确实存在语法错误,但实际上没有。

有什么建议吗?

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

虽然这是可能的,但确实不可行。我在这个问题上做了很多研究,但找不到直接的答案

我去看了一下WP_Query 类来获得可能的解决方案,我得出结论,我试图用一个或两个简单的线性代码实现的目标是不可能的。

陷阱要获得正确的相邻帖子,必须匹配原始搜索查询。与原始搜索查询的任何偏差都将返回不正确的相邻帖子

单个搜索词很容易复制,在大多数情况下都能很好地工作。问题出现在多个搜索词或句子中。这是由WP_Query

中有一个停止字过滤器WP_Query 类,该类筛选搜索词并从搜索查询中删除这些停止词(如果存在)。因此,这也需要在自定义searh查询中复制,以便与原始搜索结果保持一致

要获得一致和正确的结果,您必须从WP_Query 类并将其合并到相关函数中。这确实不可行。

最好的解决方案是继续使用WP_Query 保持推荐页面的结果一致,并获得正确的相邻帖子。这个问题的链接答案中的方法有点笨重和多余,我正忙着重写它。通过使用date_query Wordpress版本3.7中引入的参数

结束

相关推荐

search form display no result

我在页脚中创建了一个searchform。php <div id=\"cd-search\" class=\"cd-search\"> <form role=\"search\" method=\"get\" id=\"searchform\" class=\"searchform\" action=\"<?php echo esc_url( home_url( \'/\' ) ); ?>\"> <input type