WPの挿入PHP関数とカスタムフィールド


26

WordPress関数は、プログラムでデータを送信するために使用されます。コンテンツ、抜粋、タイトル、日付などを含めるために送信する標準フィールド。

ドキュメントがないのは、カスタムフィールドに送信する方法です。私はそれがadd_post_meta($post_id, $meta_key, $meta_value, $unique);機能で可能であることを知っています。

しかし、それを標準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',
  );
  wp_insert_post( $my_post );
  ?>

回答:


35

のドキュメントを読むと、作成しwp_insert_postた投稿の投稿IDが返されます。

それを次の関数__update_post_meta(このサイトから取得して少し適合させたカスタム関数)と組み合わせた場合

/**
  * 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 );
    }
}

次のものが得られます。

$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' );

どうもありがとう。移植のアイデアを教えてください。IE。どのコードのどこに行きますか。多くの感謝
ロビンIナイト

2
よくできました。2番目のコードブロックがあなたのものに置き換わり、関数値はカスタムフィールドのキーと値のペアになります。関数をスクリプトの先頭、またはスクリプトの先頭に含まれる別の.phpファイルに配置します。
-aendrew

1
注として、私はOOPを使用しているためpublic、「関数」の前の修飾子の理由です。クラスに入れずに関数自体を含める場合、追加する必要はありませんpublic
ザック

こんにちはザック、アーンドリュー、フィリップ。すべてがうまく機能していますが、私はそれをクエリにも適用しようとしましたが、役に立ちませんでした。理由はよくわかりません。最初のカスタムフィールドの新しい投稿がどのように機能したかを知っているので、ここにリンクがあります。wordpress.stackexchange.com/questions/8622/...
ロビンIナイト

1
wordpress.stackexchangeで評判がないので、答えを追加することはできません。新しい方法がある今日の時点で、あなたは、単にwp_insert_postに配列に入れることができますように:meta_input =>配列(キー=>値)
フレデリックウィッテ

13

「wp_insert_post」の後に「add_post_meta」を簡単に追加できます

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

wp_insert_post();で使用できるとは思わない。

その理由は、WPが2つのデータ型を保存する方法が原因です。投稿は、1ダースの異なる列を持つ1つの大きなモノリシックテーブルに保存されます(wp_posts)。カスタムフィールドは、主に投稿に関連付けられたメタキーと値で構成される、よりシンプルな4列のテーブル(wp_postmeta)に保存されます。

そのため、投稿IDを取得するまで、カスタムフィールドを実際に保存することはできません。

これを試して:

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);

このコーデックスの投稿は役に立ちました-あなたがやっていることの反対です(つまり、投稿の削除時にDB行を削除する):http : //codex.wordpress.org/Plugin_API/Action_Reference/delete_post


その場合、私が見ることができる唯一の方法は、セッションを使用することです、それは正しいでしょうか。
ロビンIナイト

いや; あなたのプラグインが投稿の保存と同時にカスタムフィールドを挿入しようとしていると思いますよね?投稿を保存した後、WPにフックし、投稿の新しいID番号を取得し、それをadd_post_meta()に提供する必要があると思います。CFを作成します。すぐに答えをいくつかのコードで更新します。
-aendrew

助けてくれてありがとう。ところで、プラグインではありません。必要に応じてカスタマイズできるように作成しました。(しかし、私はPHPに長けているという意味ではありません。ただ試行錯誤します)
ロビンIナイト

それがテーマですか?実際の違いは、その場合、それをfunctions.phpに入れることだけです。
-aendrew

1

save_postフィルターを使用add_post_metaしてから、フィルター関数を呼び出します。


役に立たない。$ post-> IDはwp_insert_post_dataでは利用できません。これはカスタムフィールドの作成に必要です。
-aendrew

@aendrew save_postアクションは関数の最後にあり、投稿のIDとオブジェクトが渡されます。答えは健全です。
11

1
Rarst、これが編集されたと確信しています。とにかく、今では理にかなっています。
-aendrew

@aendrewああ、ごめんなさい-気づかなかった
-Rarst
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.