Я использовал плагин Расширенные настраиваемые поля для создания нового настраиваемого поля в Wordpress. Теперь моя цель — переместить все ссылки для скачивания из «содержимое» во вновь созданное пользовательское поле «the_field('скачать_ссылка')». Проблема в том, что мне нужно изменить более 10 000 сообщений. Мне было интересно, есть ли быстрый способ сделать это, вместо того, чтобы вручную перемещать ссылку для скачивания для каждого сообщения?
Пожалуйста, смотрите изображения ниже, чтобы понять, чего я пытаюсь достичь.
Одним из препятствий является то, что весь контент сохраняется в таблице «wp_posts», где содержимое настраиваемого поля сохраняется в таблице «wp_postmeta».
Содержимое, сохраненное в пользовательском поле «download_link», выглядит следующим образом в таблице «wp_postmeta»:
(8214, 2282, 'download_link', '<div class=\"source\"><a href=\"https://www.google.com/\" target=\"_blank\"><img src=\"https://www.google.com/image.png\"></a></div>'),
(8215, 2282, '_download_link', 'field_5cffd35335ce3'),
(8220, 2280, 'download_link', '<div class=\"source\"><a href=\"https://www.google.com/\" target=\"_blank\"><img src=\"https://www.google.com/image.png\"></a></div>'),
(8221, 2280, '_download_link', 'field_5cffd35335ce3'),
(8226, 2278, 'download_link', '<div class=\"source\"><a href=\"https://www.google.com/\" target=\"_blank\"><img src=\"https://www.google.com/image.png\"></a></div>'),
(8227, 2278, '_download_link', 'field_5cffd35335ce3'),
Это вообще можно сделать? Или единственный реальный способ добиться этого — вручную перемещать ссылки для скачивания?
Заранее спасибо за вашу помощь.
Это можно сделать автоматически, если формат вашей ссылки для скачивания всегда одинаков.
Сделайте резервную копию вашей базы данных
Создайте файл php с именем my-cleanup.php
.
Переберите все продукты, возьмите ссылку из описания и переместите ее в post_meta.
Запустите файл с WP-CLI:
wp eval-file my-cleanup.php
Образец кода
// Select the posts you want
$args = array(
'post_type' => 'post',
'post_status' => 'any',
// -1 means all posts
// For debug, set this to a small number
'posts_per_page' => 3,
);
// Retrieve posts
$query = new WP_Query( $args );
$posts = $query->posts;
// Pattern to match
// [wpdm_package id='90228']
$pattern = "/(\[wpdm_package id='\d+'\])/";
// Process posts one by one
foreach ( $posts as $post ) {
echo "Processing " . $post->post_title . "\n";
$post_args['ID'] = $post->ID;
// Get the shortcode from the post content
preg_match( $pattern, $post->post_content, $matches );
// Do we have a match?
if ( count( $matches) > 0 ) {
// Retrieve shortcode
$shortcode = $matches[0];
// Convert shortcode, maybe add some HTML
$link = do_shortcode( $shortcode );
// remove shortcode from description
$post_args['post_content'] = preg_replace( $pattern, '', $post->post_content );
// Update post
wp_update_post( $post_args );
// Create the post_metas
add_post_meta( $post->ID, '_download_link', 'field_5cffd35335ce3', true );
add_post_meta( $post->ID, 'download_link', $link, true );
}
}
Примечания
Сделайте резервную копию вашей базы данных
Протестируйте несколько сообщений, чтобы убедиться в своем коде. Вы можете восстановить предыдущую версию в редакторе.
Затем попробуйте 100, затем 1000. Вы часто будете находить небольшие различия в том, как вводятся сообщения.
Это может занять несколько часов, чтобы запустить 10 000 сообщений, поэтому вам нужна команда WP-CLI.
Привет Кристиан! Ваш код работает! После нескольких проб и ошибок, разобравшись с WP-CLI (Новый пользователь!) Я опробовал несколько сообщений, и все работает отлично! Я немного изменил кодировку, так как хотел просто переместить шорткод, а не преобразовывать его в ссылку, но, несмотря на это, я очень благодарен за ваше время и помощь! Это действительно много значит и сэкономит мне много времени! Спасибо еще раз!
Привет Кристиан, спасибо за ваш ответ. Все ссылки для скачивания имеют тот же формат, что и в виде шорткода, так как я использую WP Download Manager. Например: [wpdm_package id='90228']. Ссылки для скачивания в моем начальном сообщении взяты с другого моего веб-сайта, который я вручную переместил в пользовательское поле. Теперь большая проблема - переместить 9500+ ссылок для скачивания (шорткод) в пользовательское поле! Если вы не против показать мне, что делать во второй части, пожалуйста, я был бы очень признателен за ваше время и помощь. Спасибо.