Làm cách nào để chỉ lưu siêu dữ liệu cho một loại bài đăng tùy chỉnh cụ thể?


16

Tôi đang cố gắng thiết lập một loại bài đăng tùy chỉnh theo hướng dẫn này . Tuy nhiên, tôi hơi bối rối khi thực hiện như thế nào / ở đâu update_post_meta(). Hướng dẫn gợi ý mẫu này:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

Cái nào hoạt động, nhưng có tác dụng đáng tiếc khi thêm siêu dữ liệu đó vào mỗi bài đăng, cho dù nó có thuộc loại tùy chỉnh này hay không.

Tôi đã đặt ở trên functions.phpvà đoán rằng đó có thể là một phần của vấn đề. Tôi đoán tôi cần hạn chế hành động 'save_post' chỉ kích hoạt các bài đăng thuộc loại tùy chỉnh của mình.


Câu hỏi hay về Bobby Jack nhưng tôi có thể yêu cầu bạn đổi tên câu hỏi thành một câu như "Cách chỉ lưu siêu dữ liệu cho các loại bài đăng tùy chỉnh cụ thể"; như tiêu đề của bạn quá chung chung để mọi người nhận ra khi họ đang tìm kiếm một giải pháp cho vấn đề này.
MikeSchinkel

@Mike: đã hoàn thành (hoàn toàn đồng ý với đề xuất của bạn, cảm ơn!)
Bobby Jack

Câu trả lời:


18
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

Cần làm việc. Chỉ cần thay thế 'your_post_type' bằng tên của loại bài đăng. Ngoài ra, thực tế ít được biết đến: hook 'save_post' vượt qua ID của bài đăng làm đối số.

BIÊN TẬP

Tôi đã cập nhật chức năng để phản ánh bình luận của Jan. Cảm ơn tháng giêng!


1
Nó thậm chí còn tự thêm bài đăng làm đối số thứ hai , vì vậy bạn không cần sử dụng biến toàn cục.
Jan Fabry

Giải pháp này có hiệu quả ... Tôi đã sử dụng nó cho các dự án khách hàng trước đây với rất nhiều thành công.
EAMann

Brilliant- hoạt động như một nét duyên dáng. Và tôi giả định rằng sẽ hợp lý khi làm "if ($ post-> post_type == 'động vật') {update_post_meta ($ ID," number_of_legs ", $ _POST ['number_of_legs']);} khác if ($ post-> post_type == 'phương tiện') {update_post_meta ($ ID, "number_of_wheels", $ _POST ['number_of_wheels']);} // ... vv ... để xử lý một số loại bài đăng khác nhau? (Xin lỗi cho khả năng định dạng kém của các bình luận!)
Bobby Jack

Trên thực tế, với nhiều loại bài đăng, tôi khuyên bạn nên sử dụng câu lệnh chuyển đổi thay thế. Đánh dấu ít hơn, hiệu suất nhanh hơn, dễ dàng để thêm các trường hợp trong tương lai.
EAMann

@EAMann - yup, khi viết được nửa chừng, tôi nhận ra một công tắc sẽ tốt hơn, nhưng ý kiến ​​không phải là nơi lý tưởng để bắt đầu chỉnh sửa mã, vì vậy tôi đã lười biếng;)
Bobby Jack

4

Nếu bạn muốn xử lý nhiều loại bài đăng, tôi khuyên bạn nên sử dụng câu lệnh chuyển đổi cơ bản:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

Các trường hợp về cơ bản giống như if($post->post_type) == 'post_type_1') {}Nhưng không yêu cầu nhiều khối if-other. Các defaultkhối trong công tắc xử lý trường hợp kiểu bài không có trong bộ tùy chỉnh của bạn.


4

@John P Bloch và @EAMann đã đưa ra câu trả lời tuyệt vời vì vậy tôi cũng có:

  1. Xem xét tiền tố meta_key của bạn với dấu gạch dưới . Làm như vậy sẽ ẩn chúng khỏi danh sách các trường tùy chỉnh được hiển thị trên màn hình chỉnh sửa bài đăng, tức là

    chức năng save_my_metadata ($ post_id, $ post = false) {
       if ($ post-> post_type == 'your_post_type')
          update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }
    
    Rõ ràng điều đó có nghĩa là bạn cũng cần một metabox tùy chỉnh để có thể chỉnh sửa các trường. Đây là một màn hình chỉnh sửa cho bối cảnh:



  2. Một điều khác bạn có thể làm là thêm hook của riêng bạn để giúp lưu các loại bài đăng cụ thể dễ dàng hơn, nghĩa là hook của bạn có thể là " save_{$post_type}_post"; cho một movieloại bài viết nó sẽ được save_movie_post. Đây là những gì bạn phải thêm vào functions.phptệp chủ đề của mình hoặc trong một plugin ở đâu đó:

    add_action ('save_post', 'save_custom_post_type_posts', 10,2);
    chức năng save_custom_post_type_posts ($ post_id, $ post = false) {
       do_action ("lưu _ {$ post-> post_type} _post");
    }
    
    Sau đó, bạn có thể viết lại mã gốc của mình như vậy (bao gồm cả thủ thuật gạch dưới từ số 1 ở trên):

    add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2);
    chức năng save_my_postype_metadata ($ post_id, $ post) {
        update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']);
    }

1

Cá nhân, tôi thích làm theo mẫu dưới đây để thêm trình xử lý meta tùy chỉnh vào các loại bài đăng. Với phần bên dưới, bạn có thể thêm hỗ trợ meta vào loại bài đăng bằng cách chỉ thêm khóa hỗ trợ ('phụ đề' trong ví dụ bên dưới) vào mảng hỗ trợ cho loại bài đăng bằng cách gọi add_post_type_support ('my_post_type', 'phụ đề');

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

Hy vọng một cái gì đó như thế này sẽ sớm được thêm vào cốt lõi.


0

Kiểm tra cập nhật trước xem bài đăng hiện tại có thuộc loại bài đăng của bạn hay không. Điều đó sẽ đảm bảo bạn không lưu nó cho tất cả các bài viết.

Bạn cũng nên kiểm tra đầu vào (thiếu trong ví dụ của bạn) và bên cạnh đó, hãy nhớ rằng bạn chỉ có thể thêm hành động khi loại bài đăng đó đang hoạt động. Nếu đó là trường hợp, bạn không cần phải kiểm tra loại bài đăng đó sau này.

Lấy loại bài đăng: get_post_type()hoặc$post->post_type;


0

Tôi không thể làm việc này - không chắc tôi đang làm gì sai - nhưng tôi đang cố sử dụng hook post_updated thay vì save_post - vì tôi muốn các giá trị này được chèn sau khi bài đăng được cập nhật để tôi có thể truy xuất các giá trị từ các trường tùy chỉnh khác .

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');

Không sao đâu, tôi đã đoán ra!
jrutter
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.