Có cách nào để đặt các trường tùy chỉnh mặc định khi tạo bài đăng không?


11

Khi tôi đang tạo một bài đăng mới, ngay sau khi nhấp vào "Thêm mới" , khi trình chỉnh sửa bài đăng hiển thị, thay vì phải sử dụng trình đơn thả xuống và chọn một trường tùy chỉnh để sử dụng, tôi muốn có một số đầu vào trường tùy chỉnh mặc định kết thúc mở.

Trực quan, thay vì:

nhập mô tả hình ảnh ở đây

Tôi muốn có một cái gì đó như:

nhập mô tả hình ảnh ở đây

Tôi biết có các plugin cho điều đó (CPT, Nhiều trường hơn, v.v.) nhưng tôi muốn một cách đơn giản để làm điều đó với một chức năng cơ bản.

Tôi đã thử một cái gì đó như thế này (Tôi đang sử dụng một loại sản phẩm tùy chỉnh 'sản phẩm'):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Nhưng điều đó dường như không hoạt động. Tôi nghĩ rằng hook có thể sai (vì edit_postxuất hiện sau khi cập nhật), nhưng tôi không thấy bất kỳ hook nào cho "bài đăng mới" (ngay sau khi người dùng nhấp vào "bài đăng mới" trong quản trị viên wp). Có cái nào không?

Hoặc có thể toàn bộ ý tưởng là sai và có một cách khác?

Câu trả lời:


9

Móc hành động save_postđược gọi là lưu, nhưng tôi không biết liệu bạn có thể thêm siêu dữ liệu vào lúc này không. Nhưng có thể tạo / cập nhật dữ liệu meta của bạn sau khi bài đăng được lưu với hook hành động updated_post_meta.

BIÊN TẬP

Để chọn trước một số trường meta (trường tùy chỉnh) trên màn hình tạo bài đăng, trước tiên bạn phải thêm các giá trị meta này với giá trị trống.

Nếu bạn nhìn vào post_custom_meta_box()hàm (là hàm gọi lại cho metabox đã sử dụng postcustom) trong tệp wp-admin/includes/meta-boxes.php, bạn có thể thấy rằng hàm đang sử dụng list_meta()để tạo các trường meta được chọn trước.

Bây giờ, hãy xem luồng chương trình cho đến khi metabox này được hiển thị (Chúng tôi đang tìm kiếm một hook hành động / bộ lọc chúng ta có thể sử dụng ở đây):

  1. WordPress tải tập tin post-new.php
  2. Tệp này tạo một bài đăng mặc định trong cơ sở dữ liệu trực tuyến 39với chức năng get_default_post_to_edit(). Đó là tốt đẹp. Về cơ bản bài viết đã có trong cơ sở dữ liệu dưới dạng bản nháp tự động. Thật không may, không có bất kỳ hook nào tại thời điểm này để thay đổi những dữ liệu này hoặc thêm một cái gì đó mới.
  3. Là một bước tiếp theo, tập tin edit-form-advaned.phpđược bao gồm. Tệp này sẽ tạo trang quản trị lỗ và bao gồm tất cả các metabox cần thiết dựa trên supportstham số của loại bài đăng.
  4. Trên dòng 136các trường tùy chỉnh metabox postcustomđược bao gồm và chức năng trên được gọi. Một lần nữa, không có móc hành động mà chúng ta có thể sử dụng.

Phần kết luận

Tôi nghĩ cách duy nhất bạn có thể làm là sử dụng jQuery hoặc quá tải postcustommetabox và thêm các giá trị meta trước khi bạn chạy list_meta()hàm.

Ví dụ

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

Vấn đề là hiện tại tôi không cố gắng thêm bất cứ thứ gì vào lưu, tôi đang cố gắng hiển thị một số đầu vào trường tùy chỉnh đã được mở khi người dùng mảng trên trang chỉnh sửa (xem cập nhật với ảnh chụp màn hình)
mike23

Ah. Bây giờ tôi hiểu vấn đề của bạn. Tôi đã chỉnh sửa câu trả lời của mình.
rofflox

3

Đây là phương pháp thích hợp để thêm hỗ trợ các trường tùy chỉnh (bạn không nhận được các trường trống khi chỉnh sửa bài đăng)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');

1

Bạn nên sử dụng hành động save_post và cô lập hoạt động của mình bằng cách kiểm tra loại bài đăng vì nó chạy trên tất cả các loại bài đăng. Rõ ràng có một số logic hơn bạn sẽ phải xây dựng vào điều này để làm cho nó hoạt động cho bạn. Có lẽ bạn nên đặt trường meta bài kiểm tra nếu bạn đã đặt mặc định một lần để người dùng của bạn sẽ không nản lòng nếu họ muốn để trống trường meta bài đăng.

Nếu bạn muốn mặc định là null (như đã thấy trong ví dụ mã của bạn), thì đừng tạo hàm vì điều này chỉ thêm các trường meta và bài meta không được điền với các giá trị theo mặc định.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');

1

Tôi đang tìm kiếm một mô tả meta duy nhất cho mỗi bài đăng tùy chỉnh trên trang WP tôi đang phát triển. Vì vậy, tôi cũng đang tìm kiếm một trường tùy chỉnh mặc định và hạ cánh ở đây.

Tôi biết đây là một bài viết khá cũ, nhưng tôi nghĩ tôi đã đăng câu trả lời đơn giản mà tôi tìm thấy tại mariokostelac.com .

kg là không gian tên của tôi, bạn có thể đặt tên cho hàm bạn thích. Tôi khá mới đối với hook và tùy chỉnh WP nói chung, nhưng tôi tin rằng wp_insert_post là hook bạn đang tìm kiếm.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}

FYI: Có get_post_type(). Ngoài ra, khi thực hiện so sánh lỏng lẻo, bạn nên sử dụng cú pháp điều kiện kiểu YODA.
kaiser

@kaiser bạn có ý nghĩa gì với phong cách YODA? Ngoài ra tại sao get_post_type($post_id) tốt hơn $_GET['post_type']?
Aziz

1
Sử dụng giá trị trước khi so sánh : 'page' === $_GET['post_type']. Khác, khi bạn quên một đơn, =bạn có thể rơi vào tình huống bạn gán một giá trị thay vì so sánh hai giá trị. Và đó sẽ là rác trong cơ sở dữ liệu của bạn. Bạn cũng có thể muốn sử dụng so sánh === an toàn loại (là giá trị page? Và là giá trị của loại string?)
kaiser

1
@kasier Tôi thấy - vậy mã cuối cùng là như thế nào : 'page' === get_post_type($post_id) ?
Aziz

-1

Nếu ai đó cần lấy trường tùy chỉnh theo loại bài đăng, tôi để lại mã bên dưới theo cách tôi đã làm và làm việc tốt cho tôi :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ('wp_insert_post', 'awh_field_type');

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.