Intereting Posts
Как пользователь может помещать пользовательскую текстовую строку в качестве заполнителя для плагина Исключение пользовательских таксономий Как настроить пользовательский каталог загрузки для каждого пользователя после перемещения каталога содержимого Необходимо добавить правило перезаписи, которое добавляет дополнительную информацию о сообщении для URL-адреса Масштабирование изображения в сообщении WordPress Буквы на главной странице WordPress для языка урду Как остановить редактирование типа сообщений, но разрешить им редактировать настраиваемый тип сообщения? Показывать в категории (таксономии) ряд сообщений, которые я хочу Меню, не отображающее все элементы Модифицированный loop-single-forum.php для работы внутри виджета боковой панели, не работающий на некоторых страницах сайта Загрузка изображения с использованием wp_insert_attachment и файла url не имеет расширения файла после обновления WordPress до 3.5+ я получаю много ошибок в плагине wpdb :: prepare () «Скоро появятся» записи блога-заполнителя? Плоские категории URL, но сохраняющая иерархия?

Как решить проблему с подозрением на память в пользовательском цикле WordPress?

Я написал плагин, который добавляет: «Откуда вы узнали о нас?» вопрос на страницу проверки WooCommerce и показывает результаты (как простая горизонтальная гистограмма) на странице wp-admin.

Плагин работал нормально, но перестал работать на некоторых, так как я написал это, похоже, из-за проблемы с памятью.

В моем файле wp-config.php у меня есть … define('WP_MEMORY_LIMIT', '128M'); … и я также пробовал 256MB , 512MB и 1G – но не из них решить проблему.

phpinfo() сообщает memory_limit из 1G – так что кажется прекрасным.

Итак, вот функция для моего плагина, в которой PHP, похоже, сдаётся:

 function get_customer_sources() { $args = array( 'post_type' => 'shop_order', 'post_status' => 'publish', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'shop_order_status', 'field' => 'slug', 'terms' => array('processing', 'completed', 'cancelled', 'failed', 'refunded') ) ) ); //$custom_posts = new WP_Query($args); global $post; // required $custom_posts = get_posts($args); $all_sources = array(); //The return array echo "<h1>START</h1>"; //while ($custom_posts->have_posts()) : $custom_posts->the_post(); //if ( $custom_posts->have_posts() ) : while ( $custom_posts->have_posts() ) : $custom_posts->the_post(); foreach($custom_posts as $post) : setup_postdata($post); //echo "<h2>A</h2>"; $order_id = $post->ID; //echo "<h3>Order ID: $order_id</h3>"; if ( get_post_meta($order_id, 'Where did you hear about us', true) ) { $source = get_post_meta($order_id, 'Where did you hear about us', true); //echo '<h4>Order ID: ' . $order_id . ': ' . $source . '</h4>'; // Fix the "Vegan event" vs "Vegan Event" problem $source = ucfirst(strtolower($source)); // Add the source to the return array if (array_key_exists($source, $all_sources)) { // Increment existing value $num = $all_sources[$source]; $all_sources[$source] = $num + 1; } else { // Add value $all_sources[$source] = 1; } //echo '<h4>Num sources: ' . count($all_sources) . '</h4>'; } //echo "<h2>B</h2>"; //endwhile; //endwhile; endif; endforeach; echo "<h1>END</h1>"; return $all_sources; }` 

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

if ( get_post_meta($order_id, 'Where did you hear about us', true) ) {

… линия …

if ( $order_id < 5000 && get_post_meta($order_id, 'Where did you hear about us', true) ) {

… и все получилось отлично.

Затем я изменил эту строку на …

if ( $order_id >= 5000 && get_post_meta($order_id, 'Where did you hear about us', true) ) {

… и он все еще работал.

Но без условия 5000 сценарий просто взрывается. (Я знаю это, потому что <h1>END</h1> не выводится.)

Итак, что не так с моим кодом и / или как я могу решить эту проблему метода, который не завершен? Например, может ли он быть написан более эффективно с точки зрения памяти? Или есть лучший подход? (Из прокомментированного вы увидите, что я уже пытался использовать WP_Query , но получаю те же результаты.)

NB – Прибл. 10 000 элементов, возвращаемых запросом.

Заранее спасибо.

Есть ок. 10 000 элементов, возвращаемых запросом.

Это ваша проблема. Независимо от того, что вы делаете внутри цикла, WordPress по-прежнему загружает 10 000 пост-объектов в память.

Запустите его и покройте немного магии в своих аргументах запроса:

 $args = array( 'fields' => 'ids', // MAGIC! Just get an array of id's, no objects committed to memory 'posts_per_page' => 500, // Batch size: big enough to reduce meta queries, small enough not to hammer memory 'post_type' => 'shop_order', 'post_status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'shop_order_status', 'field' => 'slug', 'terms' => array( 'processing', 'completed', 'cancelled', 'failed', 'refunded' ), ) ) ); $query = new WP_Query; $paged = 1; $count = 0; $total = null; do { $args['no_found_rows'] = isset( $total ); // No need to SQL_CALC_FOUND_ROWS on subsequent iterations $args['paged'] = $paged++; $post_ids = $query->query( $args ); update_postmeta_cache( $post_ids ); // Get all meta for this group of posts if ( ! isset( $total ) ) $total = $query->found_posts; $count += $query->post_count; foreach ( $post_ids as $post_id ) { $source = get_post_meta( $post_id, 'Where did you hear about us', true ); // Do your stuff here // Wipe this post's meta from memory wp_cache_delete( $post_id, 'post_meta' ); } } while ( $count < $total );