Chỉnh sửa nhanh nhanh Cập nhật> xóa các giá trị meta tùy chỉnh của tôi


7

Tôi có hai trường meta tùy chỉnh mà tôi đã bật cho mỗi bài đăng, scottb_customHeader và scottb_customTitle

Chúng hoạt động tốt miễn là tôi đang sử dụng tính năng chỉnh sửa đầy đủ để chỉnh sửa bài đăng. Tuy nhiên, khi tôi nhấp vào "Chỉnh sửa nhanh", sau đó nhấp vào "Cập nhật", các giá trị meta tùy chỉnh của tôi cho bài đăng sẽ bị xóa. Tôi cần làm gì để giải quyết?

Mã bên dưới ...

add_action('save_post', 'custom_add_save');


function custom_add_save($postID){
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $postID;
    }
    else
    {
        // called after a post or page is saved
        if($parent_id = wp_is_post_revision($postID))
        {
        $postID = $parent_id;
        }

        if ($_POST['scottb_customHeader']) 
        {
            update_custom_meta($postID, $_POST['scottb_customHeader'], '_scottb_customHeader');
        }
        else
        {
            update_custom_meta($postID, '', '_scottb_customHeader');
        }
        if ($_POST['scottb_customTitle']) 
        {
            update_custom_meta($postID, $_POST['scottb_customTitle'], '_scottb_customTitle');
        }
        else
        {
            update_custom_meta($postID, '', '_scottb_customTitle');
        }
    }
}

function update_custom_meta($postID, $newvalue, $field_name) {
    // To create new meta
    if(!get_post_meta($postID, $field_name)){
    add_post_meta($postID, $field_name, $newvalue);
    }else{
    // or to update existing meta
    update_post_meta($postID, $field_name, $newvalue);
    }
}

@Scott: Nếu bạn sử dụng Chỉnh sửa nhanh, tôi cho rằng các trường meta của bạn không được hiển thị? Trong trường hợp đó $_POST['scottb_customHeader']sẽ luôn trống và bạn vô tình xóa chúng. custom_add_saveCó lẽ bạn không nên bắn khi bạn chỉnh sửa nhanh?
Jan Fabry

3
Kiểm tra xem DOING_AJAXcó được xác định và đúng không - nếu có, trả lại ID bài đăng như DOING_AUTOSAVEhiện tại.
TheDeadMedic

@TheDeadMedic: Tôi nghi ngờ rằng cách tiếp cận này sẽ bị phá vỡ với quản trị viên được cải tiến WP 3.1. :-D
Denis de Bernardy

@Jan - chính xác trên tất cả các tính :)
Scott B

@Denis - nói gì vậy? Bây giờ họ đã ajaxified màn hình chỉnh sửa bài chính?
TheDeadMedic

Câu trả lời:


4

Thêm một cờ ẩn vào biểu mẫu chỉnh sửa bài cùng với các trường tùy chỉnh của bạn. Cái gì đó như

<input type="hidden" name="my_hidden_flag" value="true" />

Sau đó, bọc tất cả các công cụ save_post tùy chỉnh của bạn để kiểm tra cờ này. Sau đó, bạn không phải kiểm tra hằng số tự động lưu nữa - nếu cờ không tồn tại, đó là chỉnh sửa nhanh hoặc tự động lưu.

function custom_add_save($postID){

    // Only do this if our custom flag is present
    if (isset($_POST['my_hidden_flag'])) {

        // called after a post or page is saved
        if($parent_id = wp_is_post_revision($postID)) {
            $postID = $parent_id;
        }

        if ($_POST['scottb_customHeader']) {
            update_custom_meta($postID, $_POST['scottb_customHeader'], '_scottb_customHeader');
        } else {
            update_custom_meta($postID, '', '_scottb_customHeader');
        }

        if ($_POST['scottb_customTitle']) {
            update_custom_meta($postID, $_POST['scottb_customTitle'], '_scottb_customTitle');
        } else {
            update_custom_meta($postID, '', '_scottb_customTitle');
        }

    }

}

Chỉ cần trở lại cái này Hoạt động rực rỡ. Cảm ơn MathSmath!
Scott B

11

Tôi gặp vấn đề tương tự. Chỉ cần thêm đoạn mã sau vào đầu save_posthàm gọi lại hành động hook (hàm được sử dụng để lưu dữ liệu tùy chỉnh).

// handle the case when the custom post is quick edited
// otherwise all custom meta fields are cleared out
if (wp_verify_nonce($_POST['_inline_edit'], 'inlineeditnonce'))
      return;

Những gì nó thực sự làm: nó kiểm tra nếu tiết kiệm nhanh wp_nonce_fieldtồn tại và returnnếu đó là trường hợp. Không cần phải tạo thêm một trường ẩn trong biểu mẫu.


Wow, không thể tin rằng câu trả lời năm 2013 vẫn sẽ hoạt động.
dipak_pusti

Điều này cố định cho tôi
Nuno Sarmento

1

Câu hỏi khá cũ, nhưng tôi nghĩ rằng vấn đề vẫn còn tồn tại.

Thành thật mà nói không có câu trả lời tốt ở đây vì không có gì về bảo mật. Bạn lưu dữ liệu vào cơ sở dữ liệu mà không cần kiểm tra nguồn của họ ...

Bạn nên sử dụng nonce để xác minh nguồn dữ liệu - nhờ điều này, họ sẽ không bị ghi đè (cũng không xóa) bởi QuickEdit. WordPress cung cấp cho bạn những tiện ích cho việc này

Thêm vào mẫu của bạn:

wp_nonce_field('my_custom_page', '_my_custom_page');

Và hơn lúc cầu xin chức năng lưu của bạn:

if (!wp_verify_nonce( $_POST['_my_custom_page'], 'my_custom_page' )) { return $post_id; }

Bạn nên làm điều này cho mỗi bài tùy chỉnh.


0

Điều gì xảy ra là: Hành động mới trên 'save_post'không được trang bị để xử lý dữ liệu mới mà bạn có trong các trường tùy chỉnh của mình. Vì vậy, khi bài đăng lưu chạy, nó thiếu tất cả dữ liệu trường tùy chỉnh $ _POST và do đó xóa các giá trị trường, khiến bạn không còn gì.

SỬA CHỮA:

Bất cứ khi nào add_action('save_post','your_new_action');, bạn có thể khiến nó quay lại sớm nếu bạn đang ở trên màn hình 'chỉnh sửa' (nơi xảy ra các chỉnh sửa nhanh):

 global $current_screen;    
 if($current_screen->base == 'edit') return $post_id;

Hoặc bạn có thể kiểm tra thời tiết, hành động $ _POST là lưu nội tuyến (tên hành động của chỉnh sửa nhanh) và sau đó không thực hiện bất cứ điều gì sau đó để duy trì các giá trị trường tùy chỉnh của bạn:

 if( $_POST['action'] != 'inline-save' ) { echo 'Do this then..'; }

Tôi có thể phải giải thích nhiều hơn nếu bạn không chắc chắn nên đặt những đoạn này ở đâu. Nhưng tôi hy vọng nó sẽ giúp được ai đó với những vấn đề tương tự.


0

Vấn đề ở đây là WP thấy rằng các lĩnh vực của bạn chưa được đặt và bạn đang nói với WP để xóa chúng. Đừng xóa nó nếu trường không tồn tại. Xóa nó nếu trường tồn tại, nhưng trống rỗng.

    if ( isset( $_POST[$meta_key] ) ){
        $meta_value = $_POST[$meta_key];
        if ($meta_value) {
            update_term_meta($term_id, $meta_key, $meta_value);
        } else {
            delete_term_meta($term_id, $meta_key);
        }
    }

1
Xin vui lòng, không sử dụng các giá trị không được xác thực và không có giá trị và không được giải quyết khi bạn lưu một cái gì đó vào DB. Điều này rất nguy hiểm.
kaiser

@kaiser Theo WP: $meta_value (mixed) (required) The new value of the custom field. A passed array will be serialized into a string.(this should be raw as opposed to sanitized for database queries) codex.wordpress.org/Function_Reference/update_post_meta
Tim Bunch

Ngoài tham chiếu của bạn là về meta bài đăng trong khi câu trả lời của bạn xử lý meta hạn, điều này là vô nghĩa. Luôn vệ sinh cơ sở dữ liệu đầu vào, không có vấn đề gì. Trong khi cả hai sử dụng update_metadata()dưới mui xe, chức năng quan tâm đến vệ sinh là sanitize_meta(). nó là một bộ lọc và có thể được hủy đăng ký. Hoặc bạn cố gắng đảm bảo đính kèm cuộc gọi lại của riêng bạn, hoặc đơn giản là bạn không tin tưởng nó.
kaiser

Trong trường hợp, bạn có thể chỉ muốn var_dump( $GLOBALS['wp_filter']['sanitize_meta'] );ở vị trí thích hợp trong mã, để xem những gì được đính kèm và những gì làm những gì.
kaiser

1
Khá đúng. Liên kết chính xác cho meta hạn là codex.wordpress.org/Function_Reference/update_term_meta - cùng một quy trình.
Tim Bunch
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.