サポート » バグ報告と提案 » 最新版でDBエラーが出るようになってしまいました

  • 解決済 tonbo

    (@tonbo)


    カスタムタクソノミーを検索条件に含めるようにしているのですが、DBエラーが出るようになってしまいました。
    1つ前のバージョンでテストしているサイトでは正常に動作しているのですが、いざ本番サイトに移そうとwordpressを最新にしたら、エラーが出て正常表示ができなくなってしまいました。

    Query Monitorというデバッグプラグインで確認したところ、

    データベースエラー

    ・クエリー
    ーーーー
    SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
    FROM wp_posts
    WHERE 1=1
    AND ((()))
    AND wp_posts.post_type = ‘estate’
    AND (wp_posts.post_status = ‘publish’
    OR wp_posts.post_status = ‘acf-disabled’
    OR wp_posts.post_status = ‘private’)
    ORDER BY wp_posts.post_date DESC
    LIMIT 0, 10
    ーーー

    ・コールスタック
    ーーー
    wp()
    wp-includes/functions.php:960
    WP->main()
    wp-includes/class-wp.php:715
    WP->query_posts()
    wp-includes/class-wp.php:599
    WP_Query->query()
    wp-includes/class-wp-query.php:3222
    WP_Query->get_posts()
    wp-includes/class-wp-query.php:2821
    ーーー

    ・コンポーネント
    コア

    ・Error Code
    1064

    ・Error Message
    ーーー
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘))) AND wp_posts.post_type = ‘estate’ AND (wp_posts.post_status = ‘publish’ OR ‘ at line 1
    ーーー

    というようなエラーが出ています。
    古いシステムの方は、エラーなく検索結果も正常表示されています。

    どなたか、この修正方法をお分かりの方がいらっしゃいましたら、教えていただけませんでしょうか。

    やりたいことことは、不動産の物件検索をあらかじめタクソノミーで登録した検索条件をチェックボックスで選ばせて、検索する、というもので、
    プラグインの、
    Custom Post Type UI でestate(物件)というカスタム投稿タイプを作成し、タクソノミーで、賃料、エリア、物件カテゴリーといった項目を設定、それぞれに、賃料なら例えば10万円まで/〜20万円/〜30万円というような選択肢を作成しました。
    Advanced Custom Fields で上記で作成したタクソノミーをカスタムフィールドのチェックボックスの選択肢に設定して、
    管理画面で、カスタム投稿タイプで投稿する際に検索用のキーをその中から選ばせるようにしました。
    Search Everything でカスタムフィールドでの投稿内のワードを検索結果に拾ってくるようにしました。

    システム的には、カスタム投稿タイプ内のタクソノミー配列を検索結果に含めるということになると思います。
    コードは、同じものをWPの旧バージョンに持ってくると動作する、しかし新バージョンに持っていくとエラーになる、という感じです。
    (追記)ちなみに旧バージョンというのは、WP4.9.1の英語版のようです。Version.phpを見たら、パッケージのバージョン自体は同じようです。

    困ってしまっています。(T_T)
    よろしくお願いします。

    • このトピックはtonboが6年、 3ヶ月前に変更しました。
11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック投稿者 tonbo

    (@tonbo)

    その後調べてみたら、
    クエリーの4行目の
    AND ((()))
    がおかしいということはわかったのですが、こんどは、ここのコードが、どこで書き出されるのかがわからず悩んでいます。

    こんにちは

    Search Everything プラグインで発生する不具合(仕様?)のようですね。
    https://wordpress.org/support/topic/database-error-when-filtering-posts/

    環境によってエラーにならないのは MySQL のバージョンによるのかもしれません(?)
    とりあえず下記のコードで回避することはできそうです。

    functions.php 等に

    function my_posts_search( $search, $wp_query ) {
    	if ( $wp_query->is_search ) {
    		$search = str_replace( ' AND ((())) ', '', $search );
    	}
    	return $search;
    }
    
    add_filter( 'posts_search','my_posts_search', 11, 2 );
    • この返信は6年、 3ヶ月前にishitakaが編集しました。

    こんにちは

    選択したキーワードがSQLクエリに含まれていないようですが・・・キーワードが何も選ばれていない場合の処理は書かれていますでしょうか?

    また、新バージョンの環境でも選んだキーワードはちゃんとSearch Everythingに渡されているでしょうか。
    その、渡している処理がどのようなものか分からないのでなんとも言えませんが・・・

    トピック投稿者 tonbo

    (@tonbo)

    >ishitaka さま

    ありがとうございます。
    早速試してみたのですが、こちらの変更だと、検索結果のループがなぜか2回回ってしまって同じ結果が2つずつ表示されたり、検索キーと違うものが上がってきてしまったりして、検索ループ自体が正常に回らずダメなようでした。

    もし何か他にお分かりになることがございましたら、教えていただけると助かります!

    トピック投稿者 tonbo

    (@tonbo)

    >munyaguさま

    ありがとうございます。
    今貼り付けているコードが、キーワードが何も選ばれていない時に表示された結果になります。

    仮に「賃料」の項目から、10万円未満、〜20万円、〜30万円、〜40万円、〜50万円と5つを選ぶと、下記のように返ってきます。表示結果は、何もありません、となり、エラーになるSQLはこのような感じなんです;
    (実際には〜30万円と〜50万円に結果が1つずつあります)
    ーーー
    SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
    FROM wp_posts
    LEFT JOIN wp_term_relationships
    ON (wp_posts.ID = wp_term_relationships.object_id)
    WHERE 1=1
    AND ( wp_term_relationships.term_taxonomy_id IN (14,15,16,17,18) )
    AND ((()))
    AND wp_posts.post_type = ‘estate’
    AND (wp_posts.post_status = ‘publish’
    OR wp_posts.post_status = ‘acf-disabled’
    OR wp_posts.post_status = ‘private’)
    GROUP BY wp_posts.ID
    ORDER BY wp_posts.post_date DESC
    LIMIT 0, 10

    トピック投稿者 tonbo

    (@tonbo)

    タクソノミーで登録した検索キーをチェックボックスで選ぶようにして、チェックが入った項目とフリーワードに入力したキーワードに合致するものを結果にしたかったので、検索のロジックコードは、こちらを参考にさせていただき、function.phpは最初ほぼそのままでちゃんと表示されていました。

    https://kurubusi.net/expertise/webblog/wp-suumo/search/

    検索は、サイドバーに、下記のようにループで登録したタクソノミーが引っ張ってこられるように作っています。ここのコードは、チェックしましたが、タグの閉じ忘れや変な入れ子はなかったです。
    ーーーーーーーーー
    賃料 ▼
     □10万円未満
     □〜20万円まで
     □〜30万円まで
     □〜40万円まで
    ーーーーーーーーー
    エリア ▼
    (同じくチェックボックス)
    ーーーーーーーーー
    キーワード
    text input form
    ーーーーーーーーー
    <検索するボタン>

    検索結果のループがなぜか2回回ってしまって同じ結果が2つずつ表示されたり、検索キーと違うものが上がってきてしまったりして、検索ループ自体が正常に回らずダメなようでした。

    検索条件から「AND ((()))」を除去するだけなのですが・・・。ちょっと分かりませんね。
    たぶん違うと思うのですが、下記のようにするとどうでしょうか?

    $search = str_replace( ' AND ((())) ', '', $search );

    $search = str_replace( ' AND ((())) ', ' AND 1=1 ', $search );

    トピック投稿者 tonbo

    (@tonbo)

    >ishitakaさま

    ありがとうございます。
    どちらも現象は同じ現象で、先に教えていただいたsearch everythingのコード変更でも同じような感じになりました。動きを確認してみたら、

    1)タクソノミーの値をチェックボックスにした、チェックボックスで検索条件を選ぶ部分で合致しない場合=何も出ないー>合致するものがないので正常(と仮定する)

    2)同じくタクソノミーの値でチェックボックスで検索条件が合致する場合=検索結果と一致しないものも含めて表示ループが2回回っているようで、「物件1、物件2、物件3(これだけが条件に合致している)」みたいなリストが、2周り出てきますー>検索結果自体がおかしい

    3)フリーワード入力で検索条件が合致する場合=表示ループが1周りのみで検索結果と一致しないものも出てきているー>検索のループの回り方がおかしい

    4)チェックボックスとフリーワードの両方でどちらかが条件に合致しない場合=何も表示されないー>合致するものがないので正常(と仮定する)

    5)何も条件指定せずに検索ボタンのみをクリックした場合=表示ループが2回りで表示されているー>ループの回り方がおかしい

    search everythingがおかしいように見えるのですが、正常動作している方もしていない方もこのプラグインのコードは最新版で同じものを入れているので、根本的な問題は別の場所にあるのでは?と思うのですが・・・
    こまりました(T_T)

    参考にされたサイトのロジックだけ見てなのですが、以下のように変更してみてはどうでしょうか。

    $args['meta_query'] = $meta_query;
    $args['tax_query'] = $tax_query;

    if ( 0 < count( $meta_query ) ) {
    	$args['meta_query'] = $meta_query;
    }
    
    if ( 0 < count( $tax_query ) ) {
    	$args['tax_query'] = $tax_query;
    }

    元々、条件何も指定しないと何も表示されないロジックになっているようなので、用途に合っているかはちょっと分かりませんが。

    トピック投稿者 tonbo

    (@tonbo)

    >munyaguさま

    ありがとうございます。
    こちらの変更では、結果は変わらないようです。

    検索結果が不正で2回出ているのがおかしいと思うので、クエリーのループの部分に問題があるのかなと思うのですが、自分で作成したテンプレートファイルは、差分確認して見たのですが、動作しているものとしていないもの、どちらも状況が同じ(動いているテスト環境のテーマ一式を本番に持って行っても動かない)で、上記のようにSQLがおかしく書き出されてしまっている、とわかったものの、どこを直せば、この部分が直るのかがわからずの状況です;;
    データベースは、テスト環境と本番環境ではmySQLのバージョンが微妙に違うとは思うのですが、テストで、PHPとmySQLなどのサーバー環境は動作していたテスト環境と同じところに、本番からファイルとDBの複製を持ってきても、やはり本番と同じ動作をしていますので、phpとかmySQLのバージョン依存ではなさそうな感じです。

    WPのコアファイルか、プラグイン(search everythingかカスタム投稿UIあたり?)で生成しているロジックあるいはデータがおかしいのかと思うのですが・・・

    差分ファイルが一気に検索できたらいいんですが、関係しそうなところを1ファイルずつdiffかけて行っていますが、まだそれと思しき箇所が出てきていません。。。

    トピック投稿者 tonbo

    (@tonbo)

    皆さまありがとうございます。
    熟練エンジニアの方にコードを見てもらい、解決することができました。

    修正方法は、結局自分ではわからなかったのですが、解決ができたので一旦終了したいと思います。

11件の返信を表示中 - 1 - 11件目 (全11件中)
  • トピック「最新版でDBエラーが出るようになってしまいました」には新たに返信することはできません。