Nếu bạn là người đã sử dụng wordpress trên hostgator, cũng ngịch ngầm và chỉnh sửa các thông số của PHP, thì rất có thể sẽ gặp tình trạng giống như tôi. Một ngày đẹp trời hệ thống vẫn chạy bình thường nhưng không thể tìm thấy các trang tiếp theo để click. Nguyên nhân ở đâu?
Sau một buổi tối ngồi hỳ hục tìm hiểu chỉnh sửa, tôi đã hiển thị được số trang cần theo một cách nông dân là debug từng dòng lệnh. Nhưng để rồi có một kiến thức mới hay ho không kém. Cái tội là WordPress sử dụng hàm FOUND_ROWS() để tính số lượng bản ghi nếu không có giới hạn LIMIT. Nhược điểm chính của việc này là dòng lệnh trên phải được xử lý ngay sau khi câu SELECT được thực hiện.
Tại sao hệ thống lại chạy không chỉnh xác khi tôi thay đổi config của PHP, lý do là tôi muốn kiểm tra hệ thống sẽ hoạt động ra sao khi vận hành, việc cần biết đó là nó truy vấn tới database ra sao. Tôi đã chỉnh sửa một số thiết lập của PHP trong đó có mysql.allow_persistent, điều này đã làm cho câu lệnh FOUND_ROWS() luôn trả về giá trị là 1, vì đơn giản sau khi thực hiện lệnh hệ thông sẽ truy vấn thêm log của MySQL ghi ra log file, tất nhiên những truy vấn này đều có 1 kết quả trả về.
Tiếp đó hệ thống của WordPress luôn tín sai và duy nhất chỉ có một trang. Cả buổi tối ngày hôm đó tôi loay hoay và cũng chỉnh sửa được bằng cách viết 1 hàm hook vào wordpress để thay đổi cách thức tính số trang, không sử dụng FOUND_ROWS() nữa. Các bạn gặp trường hợp trên tạm thời muốn chạy có thể sử dụng hàm này:
add_filter(‘found_posts_query’, ‘wpspider_fix_max_num_pages’);
function wpspider_fix_max_num_pages ($query) {
global $wp_query;
if ($query == ” || $query != ‘SELECT FOUND_ROWS()’) return $query;
$query = $wp_query->request;
$query = preg_replace(‘/SELECT\s.+\sFROM/’, ‘SELECT 1 as id FROM’, $query);
$query = preg_replace(‘/LIMIT\s.+$/’, ”, $query);
$query = preg_replace(‘/ORDER\s+BY\s.+$/’, ”, $query);
$query = sprintf(‘SELECT SUM(id) FROM (%1$s) as `count` ‘, $query);
return $query;
}
Hơi ngu ngốc một chút vì thỉnh thoảng hệ thống có phun ra một số log error query vì câu lệnh SQL không chính xác, nhưng sẽ là tạm đủ khi bạn vừa muốn debug hệ thống vừa muốn hệ thống hoạt động bình thường.
Phạm Tuyền says
$mang=array ();
$i=0;
$result2 = mysql_query(“SELECT post_id FROM wp_postmeta WHERE meta_key = ‘hd’ AND meta_value ='{$_GET[“handinh1”]}’ “);
while ($row2 = mysql_fetch_array($result2)) { $mang[$i]=$row2[‘post_id’]; $i++; } ?>
explode(“,”,$postin)) ); ?>
<div >
ID, “thumbnail”, true);?>
<h2 class="title" id="post-“><a href="” rel=”bookmark” title=”Permanent Link to “>
“alignleft post_thumbnail”)); } ?>
<!–/post—>
Không có sản phẩm nào
Tìm kiếm ngay.
Đoạn code này tôi muốn hiển thị những bài viết được tìm kiếm theo giá trị ‘hd’ trong custom field template, kết quả tìm kiếm là chính xác nhưng có điều khi phân trang lại chỉ hiện thị trang 1, mặc dù khi kick vào trang 2 vẫn ra đúng link nhưng kết quả hiển thị lại là trang 1, tôi muốn hỏi bạn là tại sao
Rất mong được bạn giúp. Thanks !!!
Phạm Tuyền says
Rất xin lỗi bạn, nhưng tôi paste code của tôi vào đây, toàn bị mất code thôi :((
mrhoi says
Mình không đi chi tiết vào code của bạn được, nhưng theo mình nếu bạn đã sử dụng WordPress nên tránh việc hard-code như thế này, WordPress đã cung cấp thư viện để chúng ta truy xuất theo cách của nó, bạn có thể tham khảo thêm ở phần WP_Query nhé http://codex.wordpress.org/Class_Reference/WP_Query, chúc bạn thành công.