Tái tạo sên từ tiêu đề của bài viết


14

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.


Tôi đã phải làm điều này nhiều lần và thấy rằng giữa các môi trường máy chủ khác nhau, nơi nó không thể xử lý các mảng lớn (với các cột số được đặt thành không giới hạn) cũng như không gọi wp_update_post nhiều lần với mức tiêu thụ bộ nhớ lớn, phá vỡ nó thành một cuộc gọi WP_Query với phân trang và sử dụng $ wpdb rằng nó dễ quản lý và hiệu quả hơn. Tôi đã cung cấp mẫu mã trên một bài tương tự .
codearachnid

Câu trả lời:


17

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.


1
Hmmm ... từ kinh nghiệm của tôi, điều này không hoạt động. Đối post_namesố bị bỏ qua bởi wp_update_post, ít nhất là trong phiên bản 3.9 của lõi
Alexandre Bour trước

Hiện tại, post_namebị 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.
Erenor Paz


1

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_datahook bộ lọc, được gọi bởi wp_update_posthà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ể chỉ ra lý do tại sao wp_update_post ghi đè lên post_name không? lý do duy nhất tôi thấy để điều này xảy ra là nếu người dùng cố gắng sửa đổi post_name chỉ là người đóng góp (hoặc cùng cấp) trong trường hợp không nên cho phép người dùng đó thay đổi sên, bạn có tìm thấy trường hợp nào khác không post_name bị ghi đè?
jnhghy - Alexandru Jantea

Vâng, đây là cách thích hợp để làm điều đó. Cảm ơn bạn
@Alexandre

-1

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.