Поддержка Проблемы и решения Аномалия количества запросов к бд

  • Решено pelzar

    (@pelzar)


    Здравствуйте.
    Наблюдаю такую картину, в шаблоне категории вывожу категории к которым принадлежит запись.

    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <div class="block-content">
    <?php
    $post_url = get_the_permalink();
    $post_id = get_the_id();
    $post_name = get_the_title();
    echo '<h3 class="entry-title"><a href="'.$post_url.'" rel="bookmark">'.$post_name.' ('.get_post_meta($post_id, 'god', true).')</a></h3>';
    ?>
    	<?php if ( has_post_thumbnail() ): ?>
    		<div class="block-left">
    			<a href="<?php echo $post_url; ?>" title="<?php echo $post_name; ?>" >
    				<?php the_post_thumbnail( ); ?>
    			</a>
    		</div>
    	<?php endif; ?>
    
    	<div class="block-right">
    
    		<table class="category_film">
    <tr>
    <td>Жанр:</td><td class="">
    <?php
    foreach((get_the_category()) as $childcat) {
    if (cat_is_ancestor_of(1, $childcat)) {
    echo '<a href="'.get_category_link($childcat->cat_ID).'"><span>';
     echo $childcat->cat_name . '</span></a>';
    }}
    ?></td>
    </tr>
    <tr>
    <td>Страна:</td>
    <td class="">
    <?php
    foreach((get_the_category()) as $childcat) {
    if (cat_is_ancestor_of(4, $childcat)) {
    echo '<a href="'.get_category_link($childcat->cat_ID).'"><span>';
     echo $childcat->cat_name . '</span></a>';
    }}
    ?>
    </td>
    </tr>
    <tr>
    <td>Режиссёр:</td>
    <td class="">
    <?php
    foreach((get_the_category()) as $childcat) {
    if (cat_is_ancestor_of(3, $childcat)) {
    echo '<a href="'.get_category_link($childcat->cat_ID).'"><span>';
     echo $childcat->cat_name . '</span></a>';
    }}
    ?>
    </td>
    </tr>
    <tr>
    <td>В ролях:</td>
    <td class="">
    <?php
    $args=array('orderby' => 'none');
    $terms = wp_get_post_terms( $post_id , 'category', $args);
    $p=0;
    foreach($terms as $term) {
    if (cat_is_ancestor_of(2, $term)) {
      $p = $p+1;
      if ($p<=6) {
      echo '<a href="' . esc_attr(get_term_link($term, 'category')) . '" ' . '><span itemprop="name">' . $term->name.'</span></a> ';
      }
    }}
    ?>
    </td>
    </tr>
    </table>
    
    <div class='film_desc'><?php echo wp_trim_words(get_post_meta($post_id, 'description', true), 27); ?></div>
    <a href="<?php echo $post_url; ?>" title="<?php echo "Фильм $post_name смотреть онлайн"; ?>" ><div class="button-online">Смотреть онлайн</div></a>
    
    	</div>
    
    	<div class="entry-summary">
    	</div><!-- .entry-summary -->
    </div>
    </article><!-- #post-## -->
    <?php endwhile; ?>
    <?php endif; ?>

    Количество запросов к бд в данном варианте — 49
    Если мы добавим строчку

    $args = array(
    	'child_of' => 1
    );
    $categories = get_categories($args);

    где нибудь над выводом категорий самой записи, то это сократит количество запросов с 49 до 23.
    если вставить эту строчку сразу под выводом категорий записи, то запросов будет 37.

    Это что, баг? Или я чего то не понимаю…

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • P.s. данная картина наблюдается не только в категории, но и в самой записи, в общем, везде где выводятся категории записи

    Это что, баг? Или я чего то не понимаю…

    Вы делаете запросы в основной петле (aka Loop). Логично, если выводится десять постов и в каждом делается по три запроса, вот вам и результат — 30 запросов.

    Это понятно, но почему при добавлении

    $args = array(
    	'child_of' => 1
    );
    $categories = get_categories($args);

    Количество запросов падает, причем так существенно?

    Количество запросов падает, причем так существенно?

    Вам надо исследовать этот вопрос. Изучите дампы объектов; запросы, которые реально делает код.. Я не знаю логики вашего кода, но визуально он выглядит «не очень», значит уже что-то не в порядке..

    Это понятно, но почему при добавлении

    Здесь попробую предположить такую мысль — категории являются иерархической сущностью, если выбирать все, то выбирается родитель, потом его потомки и т.д (или наоборот, вверх по дереву родства). Если указать явную принадлежность child_of, то повторение запросов (перемещение по дереву) уже отсутствует.

    Здесь попробую предположить такую мысль — категории являются иерархической сущностью, если выбирать все, то выбирается родитель, потом его потомки и т.д (или наоборот, вверх по дереву родства). Если указать явную принадлежность child_of, то повторение запросов (перемещение по дереву) уже отсутствует.

    Не совсем так, если убрать сhild_of и получать вообще все категории какие есть, то количество запросов не изменится, просто немного увеличится количество потребляемой памяти.

    В итоге, как я понял, если делать запрос на получения категорий, которые вообще есть, над выводом категорий самого поста, это позволяет сильно сократить количество запросов. В этом случае, на каждый пост понадобиться уже не несколько запросов, как было до добавления этой строки, а всего 1 запрос на вывод одной записи

    если делать запрос на получения категорий, которые вообще есть, над выводом категорий самого поста, это позволяет сильно сократить количество запросов.

    И это тоже верно. В WordPress есть и активно используется объектный кеш. Один раз выбранная инфа не пропадает, а, как вы верно подметили, кушает память 😀

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Аномалия количества запросов к бд» закрыта для новых ответов.