it-swarm-vi.tech

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ể?

Tôi đang cố gắng thiết lập một loại bài đăng tùy chỉnh sau hướng dẫn này . Tuy nhiên, tôi hơi bối rối khi thực hiện/nơi thực hiện 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 trong functions.php và tôi đoán đó 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.

15
Bobby Jack
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' chuyển ID của bài đăng làm đối số.

CHỈNH SỬA

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!

16
John P Bloch

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. Khối default trong công tắc xử lý các trường hợp loại bài đăng không có trong bộ tùy chỉnh của bạn.

4
EAMann

@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') [.___ ]); [.__.]} [.__.]
    [.__.] Rõ ràng điều đó có nghĩa là bạn cần một siêu dữ liệu 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 việc lưu các loại bài đăng cụ thể dễ dàng hơn, tức là hook của bạn có thể là "save_{$post_type}_post"; đối với loại bài đăng movie thì nó sẽ là save_movie_post. Đây là những gì bạn phải thêm vào tệp functions.php của chủ đề hoặc trong một plugin ở đâu đó:

    [.___] add_action ('save_post', 'save_custom_post_type_posts', 10,2); [.__.] > 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ả mẹo gạch dưới từ số 1 ở trên):

    [.___. add_action _POST ['my_metadata']); [.__.]}
4
MikeSchinkel

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 bên dưới, bạn có thể thêm hỗ trợ meta vào loại bài đăng bằng cá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.

1
prettyboymp

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 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');
0
jrutter

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.

Nhận loại bài đăng: get_post_type() hoặc $post->post_type;

0
hakre