Regenerasi siput Dari Judul Posting

14

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.

Nicola Peluchetti
sumber
Saya harus melakukan ini beberapa kali dan menemukan bahwa antara lingkungan server yang berbeda di mana ia tidak dapat menangani array besar (dengan numberpost diatur ke tak terbatas) atau menelepon wp_update_post berulang kali dengan konsumsi memori besar yang memecahnya menjadi panggilan WP_Query dengan pagination dan menggunakan $ wpdb lebih mudah dikelola dan performan. Saya memberikan contoh kode pada pos serupa .
codearachnid

Jawaban:

17

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.

fuxia
sumber
1
Hmmm ... dari pengalaman saya, ini tidak berhasil. The post_nameargumen diabaikan oleh wp_update_post, setidaknya di 3,9 versi inti
Alexandre Bourlier
Saat ini, post_namediabaikan 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.
Erenor Paz
2

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) {

Lessan Vaezi
sumber
1

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_datahook filter, dipanggil oleh wp_update_postfungsi 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.

Alexandre Bourlier
sumber
Bisakah Anda tunjukkan mengapa wp_update_post menimpa post_name? satu-satunya alasan saya melihat hal ini terjadi adalah jika pengguna yang mencoba memodifikasi post_name hanya kontributor (atau level yang sama) dalam hal ini seharusnya tidak memungkinkan pengguna untuk mengubah siput, apakah Anda menemukan kasus lain di mana post_name ditimpa?
jnhghy - Alexandru Jantea
Ya ini cara yang tepat untuk melakukannya. Terima kasih
@Alexandre
-1

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.

iateadonut
sumber