Intereting Posts
не может изменить нижний колонтитул wp_enqueue_script не загружается в заголовке? Где я могу поместить мои add_action (… и add_filter (… и мне нужно их удалить? Можно ли добавить пользовательскую страницу на бесплатный сайт WordPress? Попросите зарегистрированного пользователя повторно ввести пароль для доступа к странице «x» Что я должен использовать – таксономии, пользовательские поля, тип сообщения? После 3.5.1. обновления, сообщения, появляющиеся на сайте еще * NOT * в WP admin! Неправильный код Gist не работает wp_update_nav_menu_item не сохраняется в API мультисайта Как получить значения параметров, установленные со всех сайтов в многоуровневой настройке? Сортировка популярных сообщений по просмотрам за последнюю неделю Ускорить MU WordPress на Apache VPS? wp_nav_menu: Есть ли способ изменить вывод <a>, который получил подменю? Как применить дружественные постоянные ссылки URL к пользовательскому шаблону WordPress? Используйте последний jQuery в WordPress (интерфейс администратора)

Удалить href tag из wp_postmeta в 34 000 сообщений?

Я использую Godaddy Hosting, PHP 5 и WordPress 4.2.1

У меня есть 34 000 + сообщений, которые требуют устаревших href-тегов. Я могу удалить теги, по одному сообщению за раз, используя этот код в шаблоне страницы и вручную изменить post_id. Спасибо @ialocin за дополнение wp-kses. Таблица wp_postmeta имеет 347 602 строки, но только 34 788 имеют строку «simple_fields».

<?php $allowed_html = array( 'p' => array(), 'img' => array( 'alt' => true, 'align' => true, 'border' => true, 'height' => true, 'hspace' => true, 'longdesc' => true, 'vspace' => true, 'src' => true, 'usemap' => true, 'width' => true, ), 'br' => array() ); ?> <?php $source = get_post_meta(24532, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', true); ?> <?php update_post_meta(24532, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', wp_kses ($source, $allowed_html) ); ?> 

Однако мне нужно применить это к тысячам строк wp_postmeta. После изменения этого примера из @TheDeadMedic я смог вызвать ошибку с помощью следующего кода, но до сих пор он ничего не делает для базы данных.

Ошибка:

Неустранимая ошибка: допустимый размер памяти 67108864 байт исчерпан (попытался выделить 32 байта) в … / wp-includes / wp-db.php в строке 2204

Если я изменил post_per_page на -1, он ничего не делает. Он просто обновляет страницу.

 <?php /** * Update All postmeta * */ $args = array( 'fields' => 'ids', // MAGIC! Just get an array of id's, no objects committed to memory 'posts_per_page' => 500, // Batch size: look at all posts 'post_type' => 'post', 'date_query' => array( // Make sure the post is over 30 days old array( 'column' => 'post_date_gmt', 'before' => '1 month ago' ) ), ); $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 ) { $allowed_html = array( // Declare tags not to be removed 'p' => array(), 'img' => array( 'alt' => true, 'align' => true, 'border' => true, 'height' => true, 'hspace' => true, 'longdesc' => true, 'vspace' => true, 'src' => true, 'usemap' => true, 'width' => true, ), 'br' => array() ); $source = get_post_meta($post_id, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', true); update_post_meta($$post_id, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', wp_kses ($source, $allowed_html) ); } } while ( $count < $total ); ?> 

Может ли кто-нибудь увидеть, что отключено или отсутствует? Имеются ли «поля» => 'идентификаторы', // MAGIC! от @TheDeadMedic нужно быть «post_id» или нужно ли это быть foreach вместо того или другого?

Каков наилучший способ сделать это автоматически, динамически, процедурно, иначе мудрый или другой?

Любые решения, подсказки, подсказки или подсказки очень ценятся.

Solutions Collecting From Web of "Удалить href tag из wp_postmeta в 34 000 сообщений?"

Во-первых, я бы подумал об использовании одной из функций wp_kses из WordPress вместо PHP strip_tags() .

Во-вторых, запрос ваших сообщений с WP_Query или get_posts() с параметрами fields установленными на ids – кажется, вам не нужно больше.

В-третьих, разделите свой цикл на эффективные и управляемые шаги. Поскольку 34000+ сообщений, скорее всего, достигнут пределов вашего сервера – по крайней мере, в отношении времени обработки.

Вы могли бы, например, сделать умное использование параметров posts_per_page и / или offset для WP_Query / get_posts . Или вы можете сделать это, posts_per_page к полному массиву идентификаторов, которые вы можете получить, установив posts_per_page -1 другим способом с помощью PHP. Для примерного подхода взгляните на следующий ответ @ TheDeadMedic на аналогичный вопрос.

Самое быстрое решение – это таблица экспортных записей из базы данных, замените теги на это с помощью любого редактора кода. Для содержимого сообщений простой текст не сериализуется, таким образом, вы можете сделать замену менее чем за 10 минут без каких-либо проблем. Затем импортируйте файл sql в db.

благодаря

Самый простой способ сделать это – через SQL. Во-первых, сделайте резервную копию своей базы данных, если что-то пойдет не так. Затем, используя phpMyAdmin или аналогичный интерфейс SQL, выполните эту команду SQL:

 UPDATE wp_posts SET post_content = REPLACE(post_content, '<br>', ''); 

Это заменит тег

 <br> 

без ничего во всех сообщениях.

Если теги находятся в метатете post и не публикуются, это немного больше, так как вам нужно будет зайти в вашу базу данных и найти, в каком мета-ключе находятся теги.

Просмотрите таблицу wp__postmeta и найдите поле, указанное выше в столбце meta_key, затем вы можете запустить этот SQL-запрос:

 UPDATE wp_postmeta WHERE meta_key = 'YourMetaKey' SET meta_value = REPLACE(meta_value, '<br>', ''); 

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

Наконец, я смог выполнить итерацию через все 34 788 записей, но только запустив работу в меньших партиях на основе даты публикации. Вот последний код, который я использовал в шаблоне страницы. Спасибо @ialocin за то, что выбрали меня на правильном пути. Работа выполнена, но должен быть более автоматический, более автоматический способ перебора сообщений без установки даты публикации или выдувания памяти. Если у вас есть лучший способ, отправьте его здесь.

  <?php /** * Remove href tags from postmeta by post date * */ $args = array( 'post_type' => 'post', 'fields' => 'ids', 'posts_per_page' => -1, // Grab all Post IDs 'date_query' => array( // Set the date range of the posts you want effected array( 'after' => 'June 1st, 2010', 'before' => array( 'year' => 2012, 'month' => 12, 'day' => 30, ), 'inclusive' => true, ), ), ); $query = new WP_Query($args); if ($query->have_posts()): foreach( $query->posts as $id ): $allowed_html = array( // Declare tags not to be removed 'p' => array(), 'img' => array( 'alt' => true, 'align' => true, 'border' => true, 'height' => true, 'hspace' => true, 'longdesc' => true, 'vspace' => true, 'src' => true, 'usemap' => true, 'width' => true, ), 'br' => array() ); // retrieve the postmeta for the specific custom field, only if it has data. $source = get_post_meta($id,'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', true); // write it back, but remove the tags with wp_kses update_post_meta($id, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', wp_kses ($source, $allowed_html) ); // Wipe this post's meta from memory wp_cache_delete($id, 'post_meta' ); endforeach; endif; ?>