web-dev-qa-db-ja.com

検索クエリから隣接する投稿を取得するためのSQLクエリ

私は忙しい カスタム関数の書き換え 最近タグ、カテゴリ、カスタム分類用語、作成者、または検索値を保存して隣接する投稿を取得するように書いていますURLに

私は私の関数を書き直すためにget_adjacent_postの構造を使っています。

これが私の持っているものです。これにより、隣接する投稿のIDが正常に取得され、URLに設定されているquery_varsに従って返されます。カスタムの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が存在する場合はtrueを返し、失敗した場合はfalseを返します。

  • $_GET['sq']の値はget_search_query()の値です。これは、同じ検索クエリに対して隣接する投稿を取得するために使用されるべき値です。

  • 私のコードには構文エラーはありません、そしてそれは機能します。私は、上記のコードブロックの中で何らかの理由でコードがおかしく見えることを知っています、そしてそれはシンタックスエラーがあるように思われますが、そうではありません。

何を追加することについて何か提案はありますか?

2
Pieter Goosen

これは可能ですが、現実的ではありません。私はこの問題について多くの研究をしましたが、素直な答えを見つけることができませんでした

私は行ってWP_Queryクラスを見て解決策を探しましたが、1つか2つの単純なライナーコードでは達成しようとしていたことは不可能であるという結論に達しました。

PITFALLS

  • 正しい隣接投稿を取得するには、元の検索クエリと一致する必要があります。元の検索クエリから逸脱すると、隣接する誤った投稿が返されます

  • 単一の検索語は複製が非常に簡単で、ほとんどの場合完全に機能しました。この問題は複数の検索語または文で発生します。これはWP_Queryクラスによって非常に特別に扱われます。

  • WP_Queryクラスには、ストップワードフィルタがあります。これは、検索語をフィルタし、これらのストップワードが存在する場合は検索クエリから削除します。そのため、元の検索結果と一致するように、カスタム検索クエリでもこれを複製する必要があります。

結論

一貫性のある正しい結果を得るには、WP_Queryクラスから完全な検索クエリセクションをコピーして、それを問題の関数に組み込む必要があります。これは現実的ではありません。

最善の解決策は、WP_Queryを使用して、結果を参照元ページからの一貫性を保ち、正しい隣接する投稿を取得することです。質問からのリンクされた回答の方法は少し大きくて冗長であり、私はそれを書き直すことに忙しいです。 Wordpressバージョン3.7で導入されたdate_queryパラメータを利用することによって、隣接する投稿を非常に簡単に検索することができます。

1
Pieter Goosen