Как увеличить количество выводимых записей для иерархической таксономии? (Ошибка HTTP 500)

12 авг. 2019 г., 17:19:27
Просмотры: 42
Голосов: 0

Я получаю ошибку HTTP 500 при попытке вывести все записи из иерархической таксономии (категории). Ошибка HTTP 500 при загрузке страницы с большим количеством записей

У меня есть страница, на которой я хочу отобразить все записи. Эта страница и записи принадлежат к одной категории, например, с названием "hello".

На странице я использовал следующий запрос для вывода записей из категории, к которой принадлежит эта страница:

<div class="box">
                            <?php
                                $category = get_the_category();
                                if($category->category_parent > 0){
                                    echo $category[0]->cat_name;
                                }
                                
                                $args = array(
                                    'post_type' => 'post',
                                    'tax_query' => array(
                                        'relation' => 'AND',
                                        array(
                                            'taxonomy' => 'category',
                                            'field'    => 'slug',
                                            'terms'    => array( $category[0]->cat_name ),
                                        ),
                                        array(
                                            'taxonomy' => 'post_format',
                                            'field'    => 'slug',
                                            'terms'    => array( 'post-format-video' ),
                                        ),
                                    ),
                                    'order'   => 'ASC',
                                    'nopaging' => true,
                                );
                                
                                $the_query = new WP_Query( $args );
                                
                                while ( $the_query->have_posts() ) {
                                        $the_query->the_post();?>
                                        <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><h3><?php the_title(); ?></h3></a>
                                <?php  }
                                
                                // Восстановление оригинальных данных поста
                                wp_reset_postdata();
                            ?>
                        </div>

Запрос работает нормально с другими категориями на других страницах, где количество записей не превышает 300. Но категория "hello" содержит более 900 записей, и при попытке их вывода с помощью того же запроса я получаю ошибку HTTP 500.

Категория "hello" является дочерней по отношению к категории "series", но это не причина проблемы, я просто хотел уточнить структуру.

Примечание: Когда в категории "hello" было 500 записей, страница работала и записи отображались, но загрузка занимала более 3 секунд. Чем больше записей добавлялось в категорию, тем дольше загружалась страница, и в итоге при превышении определенного количества записей появлялась ошибка HTTP 500.

Примечание: На локальном сервере код работает без ошибок.

Обновление: Я добавил этот код в wp-config.php:

@ini_set( 'upload_max_filesize' , '99999M' );
@ini_set( 'post_max_size', '99999M');
@ini_set( 'memory_limit', '999999M' );
@ini_set( 'max_execution_time', '300000' );
@ini_set( 'max_input_time', '300000' );

И этот код в .htaccess:

php_value upload_max_filesize 99999M
php_value post_max_size 99999M
php_value memory_limit 999999M
php_value max_execution_time 300000
php_value max_input_time 300000

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

После добавления этих настроек вместо ошибки 500 я стал получать ошибку 503.

Комментарии

Вообще говоря, это скорее проблема настроек PHP, чем WordPress, поэтому вам следует увеличить настройки PHP для времени выполнения и т.д., но здесь есть определенные ограничения. Что касается оптимизации на стороне WordPress, во-первых, вы можете рассмотреть использование чего-то вроде 'fields' => 'ids', что даст вам только идентификаторы, но уменьшит нагрузку запроса. Вам, конечно, придется соответствующим образом изменить свой цикл. Во-вторых, при работе с ресурсоемкими запросами рекомендуется использовать механизмы кэширования, например, транзиенты. И наконец, действительно ли необходимо загружать все записи.

Nicolai Grossherr Nicolai Grossherr
13 авг. 2019 г. 09:59:23

Да, я хочу все записи, потому что это как телешоу со всеми эпизодами

Maher Aldous Maher Aldous
13 авг. 2019 г. 15:42:06

Ну, это не значит, что вы должны загружать их все сразу, вы можете, например, разделить процесс загрузки. В любом случае, удачи вам и больших успехов.

Nicolai Grossherr Nicolai Grossherr
13 авг. 2019 г. 16:05:01

Да, я об этом подумал. Думаю, сначала загружу 100 постов при первой загрузке, а затем, когда страница загрузится, буду использовать WordPress AJAX для загрузки остальных постов. Что ты думаешь об этом?

Maher Aldous Maher Aldous
13 авг. 2019 г. 17:14:33

Это хороший вариант, только не забывай про кеширование.

Nicolai Grossherr Nicolai Grossherr
13 авг. 2019 г. 19:50:42

Да, я не забуду, и оставлю этот вопрос открытым в надежде, что у кого-то будет решение :)

Maher Aldous Maher Aldous
14 авг. 2019 г. 19:31:55
Показать остальные 1 комментариев