чи можливо програматично відновлювати шлаків після зміни заголовків посади? Численні заголовки публікацій були оновлені, а слизька не оновлювалася заголовком, тому мені потрібно відновити всі ці молюски.
чи можливо програматично відновлювати шлаків після зміни заголовків посади? Численні заголовки публікацій були оновлені, а слизька не оновлювалася заголовком, тому мені потрібно відновити всі ці молюски.
Відповіді:
Так, можливо.
Зразок коду, має бути перевірений та уточнений:
// 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
)
);
}
}
Я щойно це придумав, мабуть, є деякі помилки та випадки, наприклад, але це повинно дати вам уявлення. Також це може зайняти деякий час, тому може бути корисно розділити оновлення на менші шматки.
post_name
Аргумент ігнорується wp_update_post
, по крайней мере , в версії ядра 3.9
post_name
вона ігнорується в межах wp_update_post()
функції, але вона враховується, коли повідомлення про оновлення викликає wp_insert_post()
функцію: це означає, що передача нового слизу в оновлення призведе до ефективної зміни його для оновлення повідомлення.
Цей плагін також виконує роботу: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Однак, оскільки це робиться лише для публікацій, у яких ще немає слизи, якщо вам потрібно відновити слизи, відредагуйте наступний рядок у плагіні:
if ($post->post_name == "") {
наприклад, ви можете змінити його на:
if (true) {
Я намагався запропонувати Тошо метод, який є "інстинктивним", але в багатьох випадках він не працює (див. Основний код, щоб отримати те, що я маю на увазі під "багатьма випадками").
Заглянувши в код, я знайшов wp_insert_post_data
гачок фільтра, викликану wp_update_post
функцією безпосередньо перед тим, як вставити пост у базу даних.
Зателефонувавши до цього фільтра та змінивши значення $data['post_name']
, я зміг змусити це правильно працювати. Wordpress класно, але так погано задокументовано ...
Я відредагував документацію , щоб більше людей могли знайти це рішення за потреби.
ви можете зробити це безпосередньо в 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' - це буде тримати ваше оновлення лише для продуктів, що займаються комерцією; ви повинні розібратися, які межі ви хочете зберегти в цьому запиті.