[wp×SQLite]ページ送り『SELECT FOUND_ROWS()』対応

categoryとかarchiveとか一覧表示すると次のページとかのリンクが出ない。
そんな条件がなければ出るのに…

つまりページ数認識ではないか?

調べてみたところ、結構な記事数があるカテゴリでも
『$wp_query->max_num_pages』が『1ページ』となってしまっている。

つまりSQL文がオカシイ

こんな単純なミスが修正されないハズがないので、
またSQLiteとMySQLとの仕様差異と皆気づくところ。

WP_Queryはwp-includes/query.phpにあるので確認したところ、そりゃ当然アタリ。

原因は『SELECT FOUND_ROWS()』

『SELECT FOUND_ROWS()』は
MySQLなら直前に実行したSQLの件数を返してくれる。
SQLiteにはない。

対処するために直前のSQLを保持しておいてカウントするように書き換えた。

対処法

/wp-content/pdo/db.phpを書き換える

function query($query)

直後に下記を追加。

if( strtolower(mb_substr(str_replace(" ","",$query),0,6)) == "select" )
{
	if($query == "SELECT FOUND_ROWS()"){
		$nowquery = $query;
		$query = $this->beforequery;
		$query  = preg_replace("/(SELECT .* FROM)/i", "SELECT COUNT(*)  FROM" , $query);
		$query  = preg_replace("/((GROUP BY|ORDER BY|LIMIT ).*)/i", "" , $query);
	}else{
		$this->beforequery = str_replace("SQL_CALC_FOUND_ROWS"," ",$query);
	}
}

selectのときだけ処理するようにしている。
日付から記事取得するための修正とセットで修正が必要。

はい、結構な力技。

因みに
SQLでcount(*)とかに直してない場合、勝手に2ページと判断して何故かページが出るようになるが、最大も最小もなく2ページだから正しくはない。

公開:2009/8/21 @ 11:30
更新:2009/11/21
更新:2010/11/15 @ 16:05
更新:2011/1/2 @ 23:49

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です