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.
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.
Yanıtlar:
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.
post_name
Bağımsız değişken tarafından göz ardı edilir wp_update_post
çekirdeğin 3.9 versiyonu, en azından
post_name
iç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.
Bu eklenti de işi yapar: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Ancak, henüz sümüklü olmayan gönderiler için olduğu gibi, sümüklü böcekleri yeniden oluşturmanız gerekirse eklentide aşağıdaki satırı düzenleyin:
if ($post->post_name == "") {
örneğin, bunu şu şekilde değiştirebilirsiniz:
if (true) {
"İç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_data
tarafı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.
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.