WP chèn chức năng bài PHP và Trường tùy chỉnh


26

Chức năng WordPress được sử dụng để gửi dữ liệu theo chương trình. Các trường tiêu chuẩn để gửi để bao gồm nội dung, đoạn trích, tiêu đề, ngày và nhiều hơn nữa.

Những gì không có tài liệu cho là làm thế nào để gửi đến một trường tùy chỉnh. Tôi biết nó có thể với add_post_meta($post_id, $meta_key, $meta_value, $unique);chức năng.

Nhưng, làm thế nào để đưa nó vào wp_insert_postchức năng tiêu chuẩn ?

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );
  wp_insert_post( $my_post );
  ?>

Câu trả lời:


35

Nếu bạn đọc tài liệu cho wp_insert_post, nó sẽ trả về ID bài đăng của bài bạn vừa tạo.

Nếu bạn kết hợp điều đó với chức năng sau __update_post_meta(một chức năng tùy chỉnh tôi có được từ trang web này và điều chỉnh một chút)

/**
  * Updates post meta for a post. It also automatically deletes or adds the value to field_name if specified
  *
  * @access     protected
  * @param      integer     The post ID for the post we're updating
  * @param      string      The field we're updating/adding/deleting
  * @param      string      [Optional] The value to update/add for field_name. If left blank, data will be deleted.
  * @return     void
  */
public function __update_post_meta( $post_id, $field_name, $value = '' )
{
    if ( empty( $value ) OR ! $value )
    {
        delete_post_meta( $post_id, $field_name );
    }
    elseif ( ! get_post_meta( $post_id, $field_name ) )
    {
        add_post_meta( $post_id, $field_name, $value );
    }
    else
    {
        update_post_meta( $post_id, $field_name, $value );
    }
}

Bạn sẽ nhận được những điều sau đây:

$my_post = array(
    'post_title' => $_SESSION['booking-form-title'],
    'post_date' => $_SESSION['cal_startdate'],
    'post_content' => 'This is my post.',
    'post_status' => 'publish',
    'post_type' => 'booking',
);
$the_post_id = wp_insert_post( $my_post );


__update_post_meta( $the_post_id, 'my-custom-field', 'my_custom_field_value' );

Cảm ơn rất nhiều. Bạn có thể cho tôi một ý tưởng về việc cấy ghép. I E. Mà nhưng mã đi đâu. Rất cám ơn
Robin I Knight

2
Hoàn thành tốt Khối mã thứ hai thay thế cho bạn, các giá trị hàm là cặp khóa / giá trị trường tùy chỉnh. Đặt hàm ở đầu tập lệnh hoặc trong tệp .php riêng được bao gồm ở đầu tập lệnh.
aendrew

1
Lưu ý, tôi sử dụng OOP vì vậy đó là lý do cho công cụ publicsửa đổi ở phía trước "hàm". Nếu bạn bao gồm chính chức năng mà không đưa nó vào một lớp, bạn không cần thêmpublic
Zack

Xin chào Zack, Aendrew và Philip. Mọi thứ đều hoạt động tốt tuy nhiên tôi đã cố gắng áp dụng nó cho một truy vấn cũng không có kết quả. Tôi không hiểu tại sao. Đây là liên kết vì tất cả các bạn đều biết bài đăng mới của trường tùy chỉnh ban đầu hoạt động như thế nào. Tôi nghĩ bạn có thể thấy lỗi của tôi. wordpress.stackexchange.com/questions/8622/ Kẻ
Hiệp sĩ Robin I

1
Tôi không thể thêm câu trả lời, vì tôi không có tiếng tăm trên wordpress.stackexchange. Kể từ hôm nay, có một phương thức mới, bạn chỉ cần đặt một mảng vào wp_insert_post là: meta_input => mảng (key => value)
Frederik Witte

13

Bạn có thể đơn giản thêm 'add_post_meta' sau 'wp_insert_post'

<?php 
$my_post = array(
     'post_title' => $_SESSION['booking-form-title'],
     'post_date' => $_SESSION['cal_startdate'],
     'post_content' => 'This is my post.',
     'post_status' => 'publish',
     'post_type' => 'booking',
  );

$post_id = wp_insert_post($my_post);

add_post_meta($post_id, 'META-KEY-1', 'META_VALUE-1', true);
add_post_meta($post_id, 'META-KEY-2', 'META_VALUE-2', true);
?>

1

Tôi không nghĩ bạn có thể sử dụng nó với wp_insert_post ();.

Lý do là vì cách WP lưu trữ hai loại dữ liệu. Bài viết được lưu trữ trong một bảng nguyên khối lớn với hàng tá cột khác nhau (wp_posts); các trường tùy chỉnh được lưu trữ trong một bảng 4 cột đơn giản hơn (wp_postmeta) bao gồm chủ yếu là một khóa meta và giá trị, được liên kết với một bài đăng.

Do đó, bạn thực sự không thể lưu trữ các trường tùy chỉnh cho đến khi bạn có ID bài đăng.

Thử đi:

function myplugin_insert_customs($pid){

    $customs = array(
    'post_id' => $pid,
    'meta_key' => 'Your meta key',
    'meta_value' => 'Your meta value',
    );

    add_post_meta($customs);

}

add_action('save_post', 'myplugin_insert_customs', 99);

Bài đăng về codex này đã giúp - nó hoàn toàn trái ngược với những gì bạn đang làm (nghĩa là xóa một hàng DB khi xóa bài): http://codex.wordpress.org/Plugin_API/Action_Reference/delete_post


Trong trường hợp đó, cách duy nhất tôi có thể thấy là sử dụng một phiên, điều đó có đúng không.
Hiệp sĩ Robin I

Không; Tôi đoán plugin của bạn đang cố gắng chèn các trường tùy chỉnh cùng lúc một bài đăng được lưu, phải không? Tôi nghĩ rằng những gì bạn cần làm là nối vào WP sau khi bài đăng được lưu, lấy số ID mới của bài đăng, sau đó cung cấp số đó cho add_post_meta (); để tạo CF. Tôi sẽ cập nhật câu trả lời của tôi trong một giây với một số mã.
aendrew

Cảm ơn đã giúp đỡ. Bằng cách này, nó không phải là một plugin. Tôi đã viết nó để chúng tôi có thể tùy chỉnh nó nhiều như cần thiết. (nhưng không dùng đến có nghĩa là tôi bất kỳ tốt với php, chỉ cần thử và sai)
Robin Tôi Hiệp sĩ

Đó là một chủ đề, sau đó? Chỉ có sự khác biệt thực sự là bạn đặt nó trong hàm.php, trong trường hợp đó.
aendrew

1

Sử dụng save_postbộ lọc, sau đó gọi add_post_metachức năng lọc của bạn.


Vô ích. $ post-> ID không có sẵn cho wp_insert_post_data, cần thiết để tạo các trường tùy chỉnh.
aendrew

save_postHành động @aendrew nằm ở cuối hàm, nó có ID của đối tượng và đối tượng được truyền cho nó, câu trả lời là âm thanh.
Hết

1
Tôi khá chắc chắn rằng điều này đã được chỉnh sửa, Rarst. Bất kể, nó có ý nghĩa bây giờ.
aendrew

@aendrew ah, xin lỗi - không để ý điều đó
Hiếm
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.