Viết lại bài sên trước khi lưu bài


8

Tôi cần truy xuất một trường ACF trong bài viết và thay đổi slug (permalink) của bài viết trước khi lưu nó vào cơ sở dữ liệu. Cách tiếp cận để đạt được điều đó là gì? Tôi cần sên để được thay đổi mỗi thao tác tạo / chỉnh sửa bài.

Câu trả lời:


16

Sau đây sẽ được coi là một bằng chứng về khái niệm hơn là một giải pháp sao chép / dán sẵn sàng.
Điều đó đang được nói, đây là cách bạn đi về nó:

Các hành động chạy bất cứ khi nào một bài đăng được cập nhật hoặc tạo ra. Bạn có thể nối một hàm gọi lại cho nó bằng cách sử dụng .save_post add_action

Do đó, trường hợp của bạn sẽ phải trông giống như thế này:

// initial hook
add_action( 'save_post', 'wpse105926_save_post_callback' );

function wpse105926_save_post_callback( $post_id ) {

    // verify post is not a revision
    if ( ! wp_is_post_revision( $post_id ) ) {

        // unhook this function to prevent infinite looping
        remove_action( 'save_post', 'wpse105926_save_post_callback' );

        // update the post slug
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => 'some-new-slug' // do your thing here
        ));

        // re-hook this function
        add_action( 'save_post', 'wpse105926_save_post_callback' );

    }
}

Điều có thể hơi khó hiểu ở trên là việc hủy và thử lại chức năng từ bên trong nó. Điều này là bắt buộc, vì chúng tôi gọi wp_update_postđể cập nhật sên, do đó sẽ kích hoạt save_posthành động để chạy lại.

Bên cạnh đó, nếu bạn muốn WP tự động tạo sên mới dựa trên tiêu đề bài đăng, chỉ cần chuyển một chuỗi trống:

wp_update_post( array(
    'ID' => $post_id,
    'post_name' => '' // slug will be generated by WP based on post title
));

cảm ơn bạn về khái niệm này, nó đã giúp tôi hiểu rõ hơn về quy trình
Vit Kos

Câu hỏi đề cập đến ACF, cụ thể là "lấy" trường (giá trị) và khái niệm của bạn hoạt động bằng php và bỏ lỡ CHÍNH XÁC những gì bạn đã nhận xét là "làm việc của bạn ở đây". Bạn có thể ném một bằng chứng về khái niệm cho việc thu hồi là tốt? (hãy nhớ trường #postname thậm chí không có ở đó cho đến khi nút "chỉnh sửa" (permalink) được nhấp. Tương tự với trường vô hình # new-post-slug)
sergio

Tôi có thể không làm điều này bằng cách sử dụng wp_insert_post_databộ lọc, chạy sau khi vệ sinh, ngay trước khi lưu không? Lợi ích lớn nhất của phương pháp này là gì.
toni_lehtimaki

2

Tôi cần điều tương tự ngoại trừ việc chỉ tạo bài.

Tôi đã triển khai giải pháp ở đây (cái này là copy / paste-ready).

Chỉ cần xóa dòng kiểm tra cả hai ngày bằng nhau và nó cũng sẽ cập nhật sên cho các hoạt động chỉnh sửa. Tuy nhiên, tôi không khuyên bạn vì nó sẽ thay đổi URL của bài đăng và điều này không tốt cho SEO, trong số những thứ khác như liên kết bị hỏng (404).

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.