0

Wordpress に大規模な DB がある場合に SQL_CALC が速度を低下させることが判明した、Wordpress の古いトピックに関するフォローアップを探しています。この投稿の下部にあるコードを使用して回避しましたが、エラー ログにエラーが生成されます。このエラーを防ぐにはどうすればよいですか?

 PHP Warning:  Division by zero in /var/www/vhosts/domain.com/httpdocs/wp-content/themes/greatTheme/functions.php on line 19

元のスレッド: http://wordpress.org/support/topic/slow-queries-sql_calc_found_rows-bringing-down-site?replies=25

私の functions.php のコード:

 add_filter('pre_get_posts', 'optimized_get_posts', 100);
 function optimized_get_posts() {
    global $wp_query, $wpdb;

    $wp_query->query_vars['no_found_rows'] = 1;
    $wp_query->found_posts = $wpdb->get_var( "SELECT COUNT(*) FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')" );
    $wp_query->found_posts = apply_filters_ref_array( 'found_posts', array( $wp_query->found_posts, &$wp_query ) );
    $wp_query->max_num_pages = ceil($wp_query->found_posts / $wp_query->query_vars['posts_per_page']);

    return $wp_query;
 }
4

2 に答える 2

1

おそらく$wp_query->query_vars['posts_per_page']0 に設定されています。これは、PHP に$wp_query->found_postsゼロで除算するように要求していることを意味します。もちろん、これはできません。この var がコードのどこに設定されているかはわかりません (WP はこれを処理していますか?) が、print_r $wp_query->query_vars['posts_per_page'];その行の前に を追加することで簡単に確認できます。

于 2012-04-10T06:58:31.467 に答える
1

@Daanの提案に基づいて、次のことを試しましたが、エラーは発生していません。

add_filter('pre_get_posts', 'optimized_get_posts', 100);
function optimized_get_posts() {
    global $wp_query, $wpdb;
    $wp_query->query_vars['no_found_rows'] = 1;
    $wp_query->found_posts = $wpdb->get_var( "SELECT COUNT(*) FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')" );
    $wp_query->found_posts = apply_filters_ref_array( 'found_posts', array( $wp_query->found_posts, &$wp_query ) );
    if($wp_query->query_vars['posts_per_page'] <= 0) {
        $wp_query->max_num_pages = 0;
    } else {
        $wp_query->max_num_pages = ceil($wp_query->found_posts / $wp_query->query_vars['posts_per_page']);
    }
    return $wp_query;
}

基本的に、コードは が正の値であるかどうかを確認し、$wp_query->query_vars['posts_per_page']したがって適切に除算できるかどうかを確認し$wp_query->found_postsます。

于 2012-04-16T21:39:24.390 に答える