Відновити слизи з назви повідомлень


14

чи можливо програматично відновлювати шлаків після зміни заголовків посади? Численні заголовки публікацій були оновлені, а слизька не оновлювалася заголовком, тому мені потрібно відновити всі ці молюски.


Мені довелося це робити кілька разів, і я виявив, що між різними серверними середовищами, де він не може обробляти великі масиви (при цьому кількість постів встановлюється необмеженим), або повторно викликати wp_update_post з великим споживанням пам’яті, що перетворює його на WP_Query виклик з використанням пагінації та використання $ wpdb, що він більш керований та ефективний. Я надав зразок коду на подібній посаді .
codearachnid

Відповіді:


17

Так, можливо.

Зразок коду, має бути перевірений та уточнений:

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

Я щойно це придумав, мабуть, є деякі помилки та випадки, наприклад, але це повинно дати вам уявлення. Також це може зайняти деякий час, тому може бути корисно розділити оновлення на менші шматки.


1
Гммм ... з мого досвіду, це не працює. post_nameАргумент ігнорується wp_update_post, по крайней мере , в версії ядра 3.9
Alexandre Bourlier

В даний час post_nameвона ігнорується в межах wp_update_post()функції, але вона враховується, коли повідомлення про оновлення викликає wp_insert_post()функцію: це означає, що передача нового слизу в оновлення призведе до ефективної зміни його для оновлення повідомлення.
Еренор Пас

2

Цей плагін також виконує роботу: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs

Однак, оскільки це робиться лише для публікацій, у яких ще немає слизи, якщо вам потрібно відновити слизи, відредагуйте наступний рядок у плагіні:

if ($post->post_name == "") {

наприклад, ви можете змінити його на:

if (true) {


1

Я намагався запропонувати Тошо метод, який є "інстинктивним", але в багатьох випадках він не працює (див. Основний код, щоб отримати те, що я маю на увазі під "багатьма випадками").

Заглянувши в код, я знайшов wp_insert_post_dataгачок фільтра, викликану wp_update_postфункцією безпосередньо перед тим, як вставити пост у базу даних.

Зателефонувавши до цього фільтра та змінивши значення $data['post_name'], я зміг змусити це правильно працювати. Wordpress класно, але так погано задокументовано ...

Я відредагував документацію , щоб більше людей могли знайти це рішення за потреби.


Чи можете ви вказати, чому wp_update_post перезаписує ім’я посади? Єдиною причиною, по якій я вважаю, що це може відбутися, це те, що користувач, який намагається змінити ім'я post_name, є лише дописувачем (або тим самим рівнем), і в цьому випадку він не повинен дозволяти цьому користувачеві змінювати слизу, чи знайшли ви інші випадки, коли post_name перезаписано?
jnhghy - Олександру Джантеа

Так, це правильний спосіб зробити це. Дякую @Alexandre
user88731

-1

ви можете зробити це безпосередньо в mysql, якщо вам потрібно. (на нашому веб-сайті woocommerce є 100 тисяч продуктів):

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

де post_type = 'product' - це буде тримати ваше оновлення лише для продуктів, що займаються комерцією; ви повинні розібратися, які межі ви хочете зберегти в цьому запиті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.