Có bộ lọc hành động / hook nào để xác thực trường tùy chỉnh trước khi xuất bản bài đăng không?


11

Tôi có một tùy chỉnh được gọi là xxxx_url. xxxx_urlnên là duy nhất

Vì vậy, trước khi xuất bản bài đăng, tôi muốn chắc chắn rằng đó xxxx_urllà duy nhất hay không? Nếu nó không phải là duy nhất, xuất bản bài đăng nên bị từ chối.

Tôi đã thử publish_post. Nhưng đó không phải là chính xác, vì nó kích hoạt khi chúng tôi xuất bản bài viết. Tôi muốn chạy mã của tôi ngay trước khi xuất bản.


1
Tại sao không đặt ID bài đăng hiện tại làm giá trị duy nhất. Giống như: 132_urlnơi 132là bài ID. Hơn bạn luôn có một giá trị duy nhất ở đây. Bên cạnh đó: Các trường tùy chỉnh nên được lưu trong save_posthành động. Trong hành động này, bạn có thể kiểm tra trường tùy chỉnh (nếu nó không trống và có một giá trị duy nhất chẳng hạn), và dựa trên điều này update_post_metahay không. Tôi đoán bạn cũng có thể kiểm tra các lĩnh vực tùy chỉnh và nếu nó không có giá trị duy nhất, thiết lập post-statusđể drafthay cái gì khác, để xuất bản vô hiệu hóa. Nếu không, tôi nghĩ rằng bạn cần jQuery để làm điều này.
LWS-Mo

Câu trả lời:


5

Khi bắt đầu wp_insert_post, chức năng lưu / cập nhật một bài đăng, có một bộ lọc được gọi wp_insert_post_empty_content. Theo mặc định, bộ lọc này kiểm tra xem các trường tiêu đề, trình soạn thảo và đoạn trích có trống không, trong trường hợp đó, quá trình lưu sẽ bị tạm dừng.

Tuy nhiên, vì tất cả các trường được lưu được chuyển đến bộ lọc này, bạn có thể mở rộng bộ lọc này để bao gồm bất kỳ thử nghiệm nào khác để xác định xem bài đăng có nên được coi là trống không. Nó sẽ là một cái gì đó như thế này:

add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {

  // extract custom field from $postarr, check uniqueness

  if ($unique) return false else return true;
  }

Lưu ý: chức năng phải trả về 'true' để tạm dừng quá trình lưu.

Nếu trường tùy chỉnh không phải là duy nhất, bạn cũng có thể muốn lặp lại cảnh báo.


2
Điều này có thể sẽ hoạt động, nhưng trông giống như một hack, hơn là một giải pháp. Tôi cũng đã xem xét điều này, nhưng sau đó đã quyết định không đăng bài vì wp_insert_post_empty_contentý nghĩa về mặt ngữ nghĩa đối với nội dung trống . Có nói rằng, tôi cũng không tìm thấy bất kỳ cái móc nào phù hợp về mặt ngữ nghĩa cho việc này.
Scott

Chà, nếu nó chỉ dành cho tiêu đề và nội dung trống thì sẽ không có bộ lọc cho các nhà phát triển.
cjbj

1
Nếu bạn tập trung ít hơn vào từ "trống rỗng", tôi sẽ nói bộ lọc này có nghĩa là kiểm tra xem bài đăng có đáp ứng các yêu cầu tối thiểu để lưu hay không. OP muốn mở rộng các yêu cầu tối thiểu. Có lẽ bộ lọc nên được đặt tên wp_insert_post_valid_contentđể thể hiện điều đó, nhưng đối với phần còn lại, nó nằm ở vị trí chính xác.
cjbj

@cjbj Khi bạn có một câu hỏi như thế này, làm thế nào để bạn tìm đúng bộ lọc? Ý tôi là, làm thế nào bạn tìm thấy wp_insert_post_empty_contentbộ lọc?
Tôi là người ngu ngốc nhất

1
Chà, khi bạn đã làm việc với WP một thời gian, bạn sẽ biết phần nào của mã tạo ra phần nào của quản trị viên. Vì vậy, bạn tìm kiếm tệp và kiểm tra mã nguồn cho các bộ lọc có sẵn.
cjbj

1

Làm thế nào về việc sử dụng AJAX để kiểm tra tính duy nhất trước khi gửi bài đăng để xuất bản?

$( '#post' ).on( 'submit', function( event ) {
  event.preventDefault(); // Prevent publishing

  //Now do some AJAX Checks
  $.post( ajaxurl, data, function(response) {
    if ( response === 'success' ) {
        $( this ).off( event ).submit();
    } else {
        alert( 'The custom field must be unique' );
    }
  });
});  

Mặc dù mã không được kiểm tra, nhưng nó sẽ hoạt động. Bạn có thể cần phải chơi với nó để có được kết quả mong muốn của bạn.


0

Tôi sẽ nối vào bộ lọc wp_insert_post_data và xử lý việc này ít xâm phạm nhất có thể bởi vì theo tôi hiểu bạn không muốn chặn việc chèn bài đăng, bạn chỉ muốn tránh xuất bản bài đăng có giá trị meta trùng lặp.

Tôi không thể dự phòng quá nhiều trong trường hợp này vì bạn đã không chia sẻ bất kỳ mã nào nhưng đây là một số mã giả của bộ lọc sẽ hoạt động:

function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
    // setup an uniqueness flag.
    $meta_is_unique = true;

    // check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
    // {...} <- your code

    // if the meta is NOT unique keep the post status in draft.
    if ( ! $meta_is_unique ) {
        // you can force the current post to be draft until the meta value will became unique.
        $data['post_status'] = 'draft';
        // maybe, update the meta value with a hint of the fact that it's not unique.
        // or display a dashboard notice about it.
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );

Một điều tuyệt vời khác về bộ lọc này là nó được tách ra khỏi bộ đính kèm wp_insert_attachment_data.

Tôi hy vọng nó có ích, và bất cứ điều gì bạn làm, nó có vẻ tuyệt vời!


2
Đó có thể không phải là một ý tưởng tốt. Điều gì nếu $data['post_status']publishvà người dùng được cập nhật nó? Sẽ không làm cho bài viết như drafttạo ra một 404vấn đề cho bài viết đó?
Scott

@Scott Nói cách khác, nếu một bài đăng được xuất bản phát hiện lưu rằng giá trị meta của nó không phải là duy nhất, thì việc xuất bản bài đăng sẽ bị từ chối và bài viết nên được soạn thảo. Một lần nữa, tôi không biết giá trị meta đó quan trọng như thế nào, nhưng nếu đó là loại dữ liệu sắp xếp hoặc thứ gì đó thiết yếu, thì trạng thái bài đăng phải là bản nháp (không có nghĩa là vấn đề 404, nó chỉ nói rằng bài đăng đã được nghỉ hưu từ chế độ xem công khai)
Andrei

-1

Việc kiểm tra nên đi đến wp_insert_post. Móc này được bắn bất cứ khi nào bài viết được xuất bản hoặc chỉnh sửa.

Ở đó, bạn có thể thực hiện một truy vấn tùy chỉnh để kiểm tra, nếu có bất kỳ bài đăng nào đã có cùng xxxx_urlgiá trị hay chưa.

add_action('wp_insert_post', function($post_id) {
    $meta_key = 'xxxx_url';
    $meta_value = get_post_meta($post_id, $meta_key, true);
    $query = new WP_Query([
        'post_type' => get_post_type($post_id),     // This might be unnecessary, if you check `post` post type only. Or use `any`.
        'meta_query' => [
            [
                'meta_key' => $meta_key,
                'meta_value' => $meta_value,
            ]
        ]
    ]);
    if ($query->have_posts()) {
        // invalid key, post with the same value already exists
    } else {
        // valid, key was not found anywhere
    }
});

3
Như tôi biết, bất cứ điều gì bạn viết bên trong bài đăng / câu lệnh khác sẽ được xuất bản kể từ khi wp_insert_posthành động kích hoạt một khi bài đăng đã được lưu, nó không thể chặn xuất bản hoặc chèn bài đăng.
Tôi là người ngu ngốc nhất

Vì vậy, bạn muốn chặn xuất bản, nếu bài viết không xác nhận? Bạn chưa viết điều đó trong câu hỏi của bạn.
Petr Cibulka

Tôi đã đề cập rõ ràng rằng If it isn't unique it should reject publishing post.trong câu hỏi của tôi.
Tôi là người ngu ngốc nhất
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.