Buộc sên bài được tự động tạo từ tiêu đề khi lưu


8

Tôi đang điều hành một trang web bất động sản có nhiều bất động sản được bán trong các khu chung cư.

Bởi vì điều này các trình soạn thảo nội dung làm là tạo một bài đăng / thuộc tính với tất cả các chi tiết và sau đó sử dụng một plugin bài đăng trùng lặp để tạo ra các bài khác.

Mỗi lần họ sao chép một bài đăng / tài sản, họ thay đổi tiêu đề để phản ánh số tài sản và có thể thay đổi một vài bit của giá dữ liệu meta.

Những gì họ quên làm là quét sạch sên và để một cái mới được tạo ra từ tiêu đề. Dưới đây là một ví dụ sên từ thuộc tính đầu tiên được nhập:

merle-court-plot-50-182-carlton-vale-nw6-5hh

nhưng sau đó khi chúng nhân đôi những con sên trở thành:

merle-court-plot-50-182-carlton-vale-nw6-5hh-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2-2
etc

Nhưng khi họ thay đổi tiêu đề, sên sẽ tốt hơn như sau:

merle-court-plot-51-182-carlton-vale-nw6-5hh
merle-court-plot-52-182-carlton-vale-nw6-5hh
merle-court-plot-53-182-carlton-vale-nw6-5hh
merle-court-plot-54-182-carlton-vale-nw6-5hh
etc

Vì vậy, câu hỏi của tôi:

Làm cách nào để buộc sên được tạo lại khi lưu bài, sau khi chúng đã cập nhật tiêu đề tài sản?

Sên cho CPT này phải luôn được tạo tự động, không bao giờ cần phải thiết lập thủ công.

Câu trả lời:


16

Cách giải quyết đơn giản nhất có thể là:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $data['post_name'] = sanitize_title( $data['post_title'] );
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'myplugin_update_slug', 99, 2 );

wp_insert_post_databị sa thải trên bài cập nhật quá? Bài viết đã được tạo bởi quá trình sao chép. Sên cần thay đổi một khi bài đăng được cập nhật với tiêu đề chính xác.
Scott

NVM Tôi đã tìm thấy câu trả lời cho nhận xét đó:A filter hook called by the wp_insert_post function prior to inserting into or updating the database.
Scott

Vâng, nó làm. Bất cứ khi nào bạn tạo hoặc cập nhật một bài đăng, bộ lọc này sẽ bị loại bỏ.
Eugene Manuilov

1
Tôi đã đính kèm với câu lệnh if một kiểm tra để đảm bảo rằng tôi cũng đang sử dụng post_type của mình.
Scott

8

Ngoài ra, chạy sên từ sanitize_title_with_dashes()xuyên qua wp_unique_post_slug()để đảm bảo rằng nó là duy nhất. Nó sẽ tự động nối '-2', '-3', v.v. nếu cần.


6

Thay vì thay thế các không gian, bạn nên sử dụng chức năng xây dựng sanitize_title()sẽ đảm nhiệm việc thay thế cho bạn.

Như thế này:

sanitize_title( $post_title, $post->ID );

Ngoài ra, bạn nên sử dụng một con sên độc đáo. Mà bạn có thể nhận được với chức năngwp_unique_post_slug()

Vì vậy, kết hợp tất cả lại với nhau một giải pháp có thể là:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'] ), $postarr['ID'], $data['post_status'], $data['post_type'], $data['post_parent'] );
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'myplugin_update_slug', 99, 2 );

Cám ơn vì cái này! Thay đổi của bạn đối với câu trả lời được chấp nhận là rất quan trọng. Nó có lẽ nên được thêm vào nó như là một chỉnh sửa mặc dù.
eddiemoya

3

Một cái gì đó tôi đã đánh dấu trong một thời gian là sau đây (chưa được kiểm tra),

Liên kết nguồn

//add our action
add_action( 'save_post', 'my_save_post', 11, 2 );

function my_save_post($post_id, $post){

   //if it is just a revision don't worry about it
   if (wp_is_post_revision($post_id))
      return false;

   //if the post is an auto-draft we don't want to do anything either
   if($post->post_status != 'auto-draft' ){

       // unhook this function so it doesn't loop infinitely
       remove_action('save_post', 'my_save_post' );

      //this is where it happens -- update the post and change the post_name/slug to the post_title
      wp_update_post(array('ID' => $post_id, 'post_name' => str_replace(' ', '-', $_POST['post_title'])));

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

Trong mã đó, chắc chắn việc hook lại là không cần thiết và ngay cả khi nó là nó sẽ cần mức độ ưu tiên và các đối số được đặt thành 11 và 2? Ngoài ra thay vì str_replace()sẽ sanitize_title_with_dashes()phù hợp hơn?
Scott

Bằng cách gọi wp_update_postchức năng, bạn sẽ gọi wp_insert_postchức năng, kích save_posthoạt hành động. Bạn sẽ nhận được vòng lặp vô hạn.
Eugene Manuilov

@EugeneManuilov - nhưng trong mã, hook đã bị xóa để không lặp lại vô hạn ...
Scott

@Brady ah ... vâng tôi hiểu. Lỗi của tôi.
Eugene Manuilov

1
@EugeneManuilov Nếu bạn bỏ phiếu cho câu trả lời này, vui lòng đảo ngược phiếu bầu của bạn. Điểm danh tiếng không phải là mối quan tâm của tôi, tuy nhiên thực tế đây vẫn là một câu trả lời hợp lý và vì vậy việc bỏ phiếu này cung cấp một sự bất đồng cho độc giả tiềm năng bằng cách hiểu sai rằng chức năng này sẽ lặp đi lặp lại vô tận khi nó sẽ không lặp lại. Ngoài ra đoạn trích này cung cấp bình luận thông qua đó sẽ cung cấp cho những người thiếu hiểu biết cơ hội tốt hơn để xem những gì xảy ra ở mỗi giai đoạn của chức năng. Họ cũng có thể áp dụng kiến ​​thức và hiểu biết này vào đoạn trích của bạn.
Adam
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.