У меня есть пользовательский тип сообщения product
как wp электронная коммерция.
Существуют сообщения 30k в нем. Также имейте, связывают пользовательскую таксономию. В основном пытаюсь экспортировать те сообщения в csv, но query_posts с таким количеством записей дает мне проблему...
Какие-либо подсказки???
Механизм запроса WordPress перетаскивает полный набор результатов в память, таким образом, они не подходят для таких больших блоков информации.
Можно использовать numberposts
и offset
в get_posts()
разделять процесс на блоки. Я не уверен, сможете ли Вы сделать это в единственном выполнении даже затем, таким образом, Вы, возможно, должны были бы сохранить, сколько блоков Вы обработали, и запустите оттуда в следующий раз.
Я недавно должен был сделать экспорт для блога с сообщениями 34K и комментариями 75K. Я смог заставить это работать путем изменения WordPress Усовершенствованный плагин Экспорта и увеличения max_execution_time в php.ini от 30 секунд приблизительно до 5 минут.
Плагин захватывает снимок всех идентификаторов сообщения в дб, затем выполняет пакеты в 20 инкрементах сообщения и циклах назад до до его сделанного. Я изменил инкременты на 40, который ускорил его и позволил ему завершаться за разумное количество времени.
Вот пример того, как запрос выполняется:
Пункт $where ниже еще определяется длинным списком если условные выражения на основе сменных опций.
$post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
$pass = 0;
$passes = 1000 + count($categories);
while ( ( $cat = array_shift($categories) ) && ++$pass < $passes ) {
if ( $cat->parent == 0 || isset($cats[$cat->parent]) ) {
$cats[$cat->term_id] = $cat;
} else {
$categories[] = $cat;
}
}
unset($categories);
<?php if ($post_ids) {
global $wp_query;
$wp_query->in_the_loop = true; // Fake being in the loop.
// fetch 20 posts at a time rather than loading the entire table into memory
while ( $next_posts = array_splice($post_ids, 0, 20) ) {
$where = "WHERE ID IN (".join(',', $next_posts).")";
$posts = $wpdb->get_results("SELECT * FROM $wpdb->posts $where ORDER BY post_date_gmt ASC");
foreach ($posts as $post) {
setup_postdata($post); ?>
Вы могли сделать запрос к месяцу или году для сокращения количества сообщений. Затем у Вас было бы несколько меньших .csv, которые можно объединить вместе.
Кроме того, можно попытаться экспортировать в .csv непосредственно от DB в phpMyAdmin.
mysqldump
от консоли. например. mysqldump --host=DB_HOST -u DB_USER -p --databases DB_NAME --tables TABLE_NAME | gzip -9 > dump-
дата + %Y-% m-% d _ % Hh%Mm%Ss.sql.gz
@Rajeev Vyas "phpMyAdmin не будет полезен, это на самом деле продукты", что делает, которые имеют к с phpMyAdmin — можно экспортировать любую таблицу или набор данных, Вы хотите …
– feeela
22.07.2011, 16:32
get_posts()
возвраты ничто, означая, что у Вас заканчиваются сообщения. – Rarst 22.07.2011, 16:56