Mesaj Başlığından Oluşan Salyangozlar


14

yazı başlıklarını değiştirdikten sonra sümüklü böcekleri programlı olarak yeniden oluşturmak mümkün müdür? Çok sayıda yazı başlıkları güncellendi ve slug başlık ile güncellenmedi, bu yüzden tüm bu sümüklü böcekleri yeniden üretmem gerekiyor.


Bunu birkaç kez yapmak zorunda kaldım ve büyük dizilerle (sayı sütunlarının sınırsız olarak ayarlandığı şekilde) işleyemediği veya wp_update_post'u sayfalama ve kullanma ile WP_Query çağrısına bölen büyük bellek tüketimi ile tekrar tekrar çağıramadığı farklı sunucu ortamları arasında buldum $ wpdb daha yönetilebilir ve performanslıdır. Ben benzer bir yazı üzerine kod örneği sağladı .
codearachnid

Yanıtlar:


17

Evet mümkün.

Örnek kod, test edilmeli ve geliştirilmelidir:

// 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
            )
        );
    }
}

Bunu yeni uydurdum, muhtemelen bazı hatalar ve egde vakaları var, ama size bir fikir vermeli. Ayrıca, bu biraz zaman alabilir, bu nedenle güncellemeyi daha küçük parçalara bölmek yararlı olabilir.


1
Hmmm ... deneyimlerime göre, bu işe yaramıyor. post_nameBağımsız değişken tarafından göz ardı edilir wp_update_postçekirdeğin 3.9 versiyonu, en azından
Alexandre BOURLIER

Şu anda işlev post_nameiçinde yok sayılır wp_update_post(), ancak güncelleme postu wp_insert_post()işlevi çağırdığında dikkate alınır : bu, yeni slug'u güncellemeye geçirmenin, yazı güncellenmesi için etkin bir şekilde değiştirilmesine neden olacağı anlamına gelir.
Erenor Paz


1

"İçgüdüsel bir" olan Toscho tarafından önerilen yöntemi deniyordum, ama birçok durumda işe yaramaz (cf "birçok durumda" ile ne demek istediğimi almak için çekirdek kodu).

Kod bakarak, ben iunto veritabanına eklemeden hemen önce fonksiyon wp_insert_post_datatarafından çağrılan filtre kanca bulundu wp_update_post.

Bu filtreyi çağırarak ve değerini değiştirerek, $data['post_name']düzgün çalışmasını sağlayabildim. Wordpress harika ama çok kötü belgelenmiş ...

Belgeleri düzenledim , böylece gerekirse daha fazla kişi bu geçici çözümü bulabilir.


Wp_update_post'un neden post_name üzerine yazıldığını söyleyebilir misiniz? bunun gerçekleşmesini görmemizin tek nedeni, post_name'i değiştirmeye çalışan kullanıcının yalnızca bir katkıda bulunan (veya aynı düzey) olması, bu durumda o kullanıcının sülük değiştirmesine izin vermemesi gerektiğinde, post_name üzerine yazılsın mı?
jnhghy - Alexandru Jantea

Evet, bunu yapmanın doğru yolu budur. @Alexandre
user88731

-1

gerekirse doğrudan mysql bunu yapabilirsiniz. (woocommerce sitemizde binlerce ürün bulunmaktadır):

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';

burada post_type = 'product' - sadece woocommerce ürünlerine yönelik güncellemenizi koruyacak; bu sorguda hangi sınırları korumak istediğinizi bulmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.