apakah mungkin untuk membuat ulang siput secara terprogram setelah mengubah judul tulisan? Banyak judul posting diperbarui dan siput tidak diperbarui dengan judul jadi saya harus membuat ulang semua siput ini.
apakah mungkin untuk membuat ulang siput secara terprogram setelah mengubah judul tulisan? Banyak judul posting diperbarui dan siput tidak diperbarui dengan judul jadi saya harus membuat ulang semua siput ini.
Jawaban:
Ya itu mungkin.
Kode sampel, harus diuji dan disempurnakan:
// 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
)
);
}
}
Saya baru saja membuat ini, mungkin ada beberapa kesalahan dan kasus egde, tetapi harus memberi Anda ide. Juga, ini mungkin memakan waktu cukup lama, jadi mungkin berguna untuk membagi pembaruan menjadi potongan-potongan yang lebih kecil.
post_name
argumen diabaikan oleh wp_update_post
, setidaknya di 3,9 versi inti
post_name
diabaikan dalam wp_update_post()
fungsi, tetapi dipertimbangkan ketika posting pembaruan memanggil wp_insert_post()
fungsi: ini berarti meneruskan siput baru ke pembaruan, akan menghasilkan perubahan yang efektif untuk pos yang diperbarui.
Plugin ini juga berfungsi: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Namun, seperti itu hanya untuk posting yang belum memiliki siput, jika Anda perlu membuat ulang siput sunting baris berikut di plugin:
if ($post->post_name == "") {
misalnya, Anda dapat mengubahnya ke:
if (true) {
Saya mencoba metode yang disarankan oleh Toscho, yang merupakan "instingtif", tetapi dalam banyak kasus tidak berhasil (cf kode inti untuk mendapatkan apa yang saya maksud dengan "banyak kasus").
Melihat dalam kode, saya menemukan wp_insert_post_data
hook filter, dipanggil oleh wp_update_post
fungsi tepat sebelum memasukkan pos iunto ke database.
Dengan memanggil filter ini, dan mengubah nilainya $data['post_name']
, saya dapat membuatnya berfungsi dengan benar. Wordpress keren tapi sangat buruk didokumentasikan ...
Saya mengedit dokumentasi , sehingga lebih banyak orang dapat menemukan solusi ini jika diperlukan.
Anda dapat melakukan ini langsung di mysql jika Anda perlu. (Situs woocommerce kami memiliki 100 dari ribuan produk):
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';
di mana post_type = 'produk' - yang akan menjaga pembaruan Anda menjadi produk woocommerce saja; Anda harus mencari tahu batasan apa yang ingin Anda pertahankan pada kueri ini.