Có thể tái tạo các con sên lập trình sau khi thay đổi tiêu đề của bài viết? Nhiều tiêu đề bài đã được cập nhật và sên không được cập nhật với tiêu đề nên tôi cần phải tạo lại tất cả các sên này.
Có thể tái tạo các con sên lập trình sau khi thay đổi tiêu đề của bài viết? Nhiều tiêu đề bài đã được cập nhật và sên không được cập nhật với tiêu đề nên tôi cần phải tạo lại tất cả các sên này.
Câu trả lời:
Vâng, nó là có thể.
Mã mẫu, phải được kiểm tra và tinh chỉnh:
// 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
)
);
}
}
Tôi mới làm điều này, có thể có một số lỗi và trường hợp egde, nhưng nó sẽ cho bạn một ý tưởng. Ngoài ra, điều này có thể mất một lúc, vì vậy có thể hữu ích khi chia bản cập nhật thành các phần nhỏ hơn.
post_name
số bị bỏ qua bởi wp_update_post
, ít nhất là trong phiên bản 3.9 của lõi
post_name
bị bỏ qua trong wp_update_post()
chức năng, nhưng nó được xem xét khi bài đăng cập nhật gọi wp_insert_post()
chức năng: điều này có nghĩa là việc chuyển sên mới sang bản cập nhật, sẽ dẫn đến thay đổi hiệu quả cho bài đăng được cập nhật.
Plugin này cũng thực hiện công việc: http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs
Tuy nhiên, vì nó chỉ làm điều đó cho các bài đăng chưa có sên, nếu bạn cần tạo lại sên, hãy chỉnh sửa dòng sau trong plugin:
if ($post->post_name == "") {
ví dụ: bạn có thể thay đổi nó thành:
if (true) {
Tôi đã thử phương pháp được đề xuất bởi Toscho, đó là "bản năng", nhưng trong nhiều trường hợp nó không hoạt động (cf mã cốt lõi để hiểu ý tôi là "nhiều trường hợp").
Nhìn vào mã, tôi tìm thấy wp_insert_post_data
hook bộ lọc, được gọi bởi wp_update_post
hàm ngay trước khi chèn bài đăng vào cơ sở dữ liệu.
Bằng cách gọi bộ lọc này và thay đổi giá trị của $data['post_name']
, tôi đã có thể khiến bộ lọc này hoạt động bình thường. Wordpress rất tuyệt nhưng được ghi lại rất tệ ...
Tôi đã chỉnh sửa tài liệu này để nhiều người có thể tìm thấy cách giải quyết này nếu cần.
bạn có thể làm điều này trực tiếp trong mysql nếu bạn cần. (trang web thương mại điện tử của chúng tôi có 100 nghìn sản phẩm):
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';
trong đó post_type = 'sản phẩm' - sẽ giữ cập nhật của bạn cho các sản phẩm thương mại điện tử; bạn nên tìm ra giới hạn nào bạn muốn giữ cho truy vấn này.