Функция `get_posts()` в WordPress может выполнять запросы медленно по нескольким причинам, особенно при наличии большого количества записей. В вашем случае, увеличение `php_memory_limit` помогло временно, но оптимизация запроса будет более эффективным решением. Вот несколько рекомендаций:
### 1. Фильтрация по категории
Да, фильтрация по категории (как в вашем втором примере) должна улучшить производительность, так как это уменьшит количество постов, которые необходимо обрабатывать. Если у вас всего около 2000 постов, но вы извлекаете только посты определенной категории, это может значительно уменьшить время выполнения функции.
### 2. Используйте параметры `posts_per_page`
Установка `numberposts => -1` заставляет WordPress загружать все посты одновременно, что может вызывать проблемы с памятью. Рассмотрите возможность использования параметра `posts_per_page` с ограничением, например, 100 постов за раз, и используйте `paged` для постраничной навигации:
```php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$posts = get_posts( array(
'posts_per_page' => 100,
'orderby' => 'date',
'order' => 'DESC',
'category_name' => 'articles',
'post_type' => 'post-item',
'paged' => $paged,
) );
```
### 3. Используйте WP_Query
Вместо использования `get_posts()`, вы можете использовать класс `WP_Query`, который предоставляет больше возможностей и гибкости:
```php
$query = new WP_Query( array(
'posts_per_page' => 100,
'orderby' => 'date',
'order' => 'DESC',
'category_name' => 'articles',
'post_type' => 'post-item',
) );
while ( $query->have_posts() ) {
$query->the_post();
// Ваш код для обработки постов
}
wp_reset_postdata();
```
### 4. Кэширование запросов
Используйте плагин для кэширования, чтобы уменьшить количество запросов к базе данных. Это может значительно уменьшить время загрузки страниц.
### 5. Оптимизация базы данных
Если в базе данных много постов, стоит рассмотреть возможность оптимизации базы данных. Это может включать в себя очистку неиспользуемых записей, оптимизацию таблиц и т. д.
### 6. Используйте выборку полей
Если вы не нуждаетесь в полной информации о постах, можно указать `fields`, чтобы получать только необходимые данные:
```php
$posts = get_posts( array(
'numberposts' => -1,
'orderby' => 'date',
'order' => 'DESC',
'category_name' => 'articles',
'post_type' => 'post-item',
'fields' => 'ids' // Получаем только ID постов
) );
```
Попробуйте внедрить эти рекомендации, чтобы улучшить производительность вашего кода и минимизировать вероятность ошибки 500.