Làm thế nào để hook update_post_meta và xóa_post_meta?


29

Tôi vẫn đang cố gắng để làm cho đầu óc mình bị cuốn vào mọi thứ, vì vậy tôi thực sự bế tắc khi cố gắng thực hiện nhiệm vụ sau:

Nếu update_post_metađược bắn thì hãy kiểm tra xem liệu meta_keynó có bằng thứ gì không (tôi muốn kích hoạt một số mã nếu sử dụng một meta_key cụ thể). Nếu khóa meta tôi đang tìm thì hãy chạy một số mã cần biết $post->IDmã meta đang được cập nhật.

Tôi cần phải móc vào delete_post_metaquá loại đó làm ngược lại như trên.

Bất cứ ai có thể cung cấp cho tôi một số mã ví dụ để nối vào update_post_metadelete_post_meta?

Câu trả lời:


45

Các update_post_metahook được gọi từ update_metadata()hàm chung hơn , vì vậy bạn có thể không tìm thấy nó trực tiếp. Ba móc là:

  • update_post_metadata, một bộ lọc cho phép bạn "đánh cắp" bản cập nhật siêu dữ liệu và làm một cái gì đó khác. Nếu bạn kết nối một hàm trả về boolean, việc thực thi dừng ở đó và boolean được trả về.
  • update_post_meta, một hành động được gọi trước khi dữ liệu được cập nhật trong cơ sở dữ liệu.
  • updated_post_meta, một hành động được gọi sau khi dữ liệu được cập nhật trong cơ sở dữ liệu.

Nếu khóa meta không tồn tại trong cơ sở dữ liệu nào, update_metadata()chuyển điều khiển đến add_metadata(), trong đó có các móc tương tự add_post_metadata, add_post_metaadded_post_meta. Điều này xảy ra trước khi update[d]_post_metađược gọi. Vì vậy, nếu bạn muốn làm gì đó khi khóa meta được thêm hoặc cập nhật, hãy nhớ móc vào cả móc update*add*móc - nhưng lưu ý rằng trong khi updated_*added_*hành động vượt qua các tham số tương tự, update_*add_*không ( add_post_metakhông vượt qua meta ID trước) .

delete_metadata()có móc tương tự: delete_post_metadata, delete_post_metadeleted_post_meta.

Mã mẫu:

add_action( 'added_post_meta', 'wpse16835_after_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'wpse16835_after_post_meta', 10, 4 );
function wpse16835_after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_do_something( $post_id, $meta_value );
    }
}

add_action( 'deleted_post_meta', 'wpse16835_deleted_post_meta', 10, 4 );
function wpse16835_deleted_post_meta( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
    if ( 'wpse16835_meta_key' == $meta_key ) {
        wpse16835_undo_something( $post_id );
    }
}

siêu thx cho việc này. Tôi đã nhận thức được về việc update_post_metasử dụng update_metadatavà trong đó, có những cái móc đến added_post_metavà đó updated_post_metalà những gì tôi có thể nhận được. Tôi không hiểu cách sử dụng. Nhưng bây giờ tôi nghĩ rằng tôi đã có nó :)
Brady

3
Cụ thể hơn, cái móc làupdated_{$post_type}_meta
Benjamin Intal

8

Câu trả lời tháng 1 bao gồm khá nhiều ở trên trừ trường hợp siêu dữ liệu tùy chỉnh bị xóa khỏi trang Chỉnh sửa bài. Điều này xảy ra không đồng bộ ngay khi bạn nhấp vào nút "Xóa" trong siêu dữ liệu, thông qua một cuộc gọi đến wp-admin / admin-ajax.php. Thật không may, các cuộc gọi đó bỏ qua delete_metadata()chức năng trong meta.php và delete_meta()thay vào đó gọi trong wp-admin / gồm / post.php (không bị nhầm lẫn với wp-gộp / post.php).

Có 2 hành động vẫn có thể được sử dụng, delete_postmeta(trước khi xóa) và deleted_postmeta(sau khi xóa). Cả hai đều chấp nhận một tham số duy nhất $mid, đó là ID của siêu dữ liệu ( không phải khóa). Bạn có thể truy xuất đối tượng siêu dữ liệu bằng cách sử dụng:

$meta = get_post_meta_by_id($mid);  

trong đó trả về một đối tượng với meta_id, post_id, meta_key abd meta_value. Tất nhiên, vào thời điểm đó deleted_postmetađược gọi là siêu dữ liệu đã bị xóa nên get_post_meta_by_id()sẽ không hoạt động (điều này làm cho hành động đó trở nên vô dụng)

Tương tự với việc cập nhật siêu dữ liệu tùy chỉnh từ trang Chỉnh sửa bài. Các update_metadata()chức năng (và hành động của mình) trong meta.php là không gọi, nhưng update_meta()chức năng trong wp-admin / includes / post.php là để thay thế. Hai hành động một lần nữa ở đây, update_postmetaupdated_postmeta. Các đối số là $ meta_id, $ post_id, $ meta_key, $ meta_value.

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.