投稿のカスタム フィールド データを一括管理するプラグインを作成したいと考えていました。投稿編集画面にメタ ボックスを追加し、add_action('save_post','function_to_update_meta') を使用して追加メタ関数をトリガーすることで、投稿メタを追加できることはわかっています。
しかし、管理メニュー ページ (カスタム管理メニューなど) で add_post_meta 関数をトリガーする方法がわかりません。どうやってするか?
前もって感謝します!
Wordpressのコーデックスに示されている例は、情報処理の方法でおそらく最良かつ最も安全です。
それをコピーして貼り付けてから、それをいじって、投稿やページを制御する方法についての良いアイデアを得てください。
良い点は、特定のPostMetaフィールドを追加する必要があるか更新する必要があるかを確認する必要がないことです。Update Post Metaを使用すると、フィールドが存在しない場合でも、適切なアクションが実行されます。
プラグイン/テーマが使用する可能性のあるグローバルコントロールを追加する場合は、更新オプションについても同じことが言えます。
内訳例:
add_action( 'add_meta_boxes', 'myplugin_add_custom_box' );
add_action( 'save_post', 'myplugin_save_postdata' );
これらはアクションフックです。1つ目は、投稿エディタ内にメタボックスが入力されているときに実行され、2つ目は、投稿が追加または更新されたときに実行されます。
function myplugin_add_custom_box()
{
add_meta_box(
'myplugin_sectionid',
__( 'My Post Section Title', 'myplugin_textdomain' ),
'myplugin_inner_custom_box',
'post'
);
add_meta_box(
'myplugin_sectionid',
__( 'My Post Section Title', 'myplugin_textdomain' ),
'myplugin_inner_custom_box',
'page'
);
}
この関数は、「add_meta_boxes」アクションフックによって呼び出されます。関数の名前とアクションフックの2番目の引数がまったく同じであることに注意してください。これにより、メタボックス、表示される予定の投稿タイプ、および内部に含まれるフォームを生成するために使用されるコールバックが登録されます。
function myplugin_inner_custom_box( $post )
{
wp_nonce_field( plugin_basename( __FILE__ ), 'myplugin_noncename' );
$value = get_post_meta($post->ID, 'myplugin_new_field') ? get_post_meta($post->ID, 'myplugin_new_field') : 'New Field';
echo '<label for="myplugin_new_field">';
_e("Description for this field", 'myplugin_textdomain' );
echo '</label> ';
echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="'.$value.'" size="25" />';
}
これは、フォームを自動的に生成するために登録されたメタボックスによって呼び出される関数です。関数が「myplugin_inner_custom_box」と呼ばれ、メタボックス登録の3番目の引数が「myplugin_inner_custom_box」とも呼ばれることに注意してください。
wp_nonce_field()は、フォームに非表示のフィールドを生成して、フォームに送信されるデータが実際にWordpressからのものであることを確認します。また、他のプラグインが「save_post」アクションフックを使用している場合に関数を終了するために使用できます。
$postオブジェクトが引数として渡されていることにも注意してください。これにより、postオブジェクトの特定のプロパティを使用できるようになります。get_post_meta()が指定された投稿IDを持つものを返すかどうかを自由にチェックしました。その場合、フィールドはその値で埋められます。そうでない場合は、「新しいフィールド」で埋められます。
function myplugin_save_postdata( $post_id )
{
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename( __FILE__ ) ) )
return;
if ( 'page' == $_POST['post_type'] )
{
if ( !current_user_can( 'edit_page', $post_id ) )
return;
}
else
{
if ( !current_user_can( 'edit_post', $post_id ) )
return;
}
$mydata = $_POST['myplugin_new_field'];
update_post_meta($post_id, 'myplugin_new_field', $mydata);
}
これは、「save_post」アクションフックによって呼び出される関数です。2番目のアクションフックの2番目の引数とこの関数の両方が「myplugin_save_postdata」と呼ばれていることに注意してください。まず、プラグインが実際にデータを保存する前に合格しなければならない一連の検証があります。
まず、指定された投稿が自動更新されるたびにメタボックスが更新されることは望ましくありません。投稿が自動更新されている場合は、プロセスをキャンセルしてください。
次に、ナンスデータが利用可能であることを確認して検証します。利用可能なナンスデータがないか、検証されていない場合は、プロセスをキャンセルします。
第三に、指定されたユーザーがedit_page権限を持っていることを確認する必要があります。この関数は、最初に投稿タイプをチェックし、次に適切な権限をチェックします。ユーザーにその権限がない場合は、プロセスをキャンセルしてください。
最後に、プラグインが最終的に検証され、情報を保存したいと思います。最後のupdate_post_meta()行を自由に追加して、すべてがどのように組み合わされるかを示しました。
$post_idが引数として関数に渡された方法に注目してください。これは、update_post_meta()関数に必要な要素の1つです。キーの名前は「myplugin_new_field」で、そのメタデータの値は、カスタムメタボックスのカスタム入力フィールドに入力したものとして保存されるようになりました。
それは私がプロセス全体を説明できるのと同じくらい簡単です。ただそれを研究して、コードで手を汚してください。学ぶための最良の方法は、理論ではなく応用を通してです。
そして、私のバージョンの例を作成しました
テスト用にいくつかの console.log 関数を追加しましたが、これは基本的に @Chris_() の回答と同じことを行っています:
メニュー コンテンツを生成するためのメニュー コールバック関数 (PHP):
function ajax_menu_callback() {
?>
<div class="wrap">
<div id="icon-themes" class="icon32"></div>
<h2>Test</h2>
<br />
<form>
<input id="meta" type ="text" name="1" value="<?php echo esc_html( get_post_meta( 1, 'your_key', true) ); ?>" />
<?php submit_button(); ?>
</form>
</div>
<?php
}
次に、管理者側で印刷する JavaScript (javascript、jquery ライブラリを含めることを忘れないでください):
jQuery(document).ready(function() {
$("form").submit(function() {
console.log('Submit Function');
var postMeta = $('input[name="1"]').val();
console.log(postMeta);
var postID = 1;
var button = $('input[type="submit"]');
button.val('saving......');
$.ajax({
data: {action: "update_meta", post_id: postID, post_meta: postMeta, },
type: 'POST',
url: ajaxurl,
success: function( response ) { console.log('Well Done and got this from sever: ' + response); }
}); // end of ajax()
return false;
}); // end of document.ready
}); // end of form.submit
次に、PHP 関数ハンドル update_post_meta (PHP):
add_action( 'wp_ajax_update_meta', 'my_ajax_callback' );
function my_ajax_callback() {
$post_id = $_POST['post_id'];
$post_meta = $_POST['post_meta'];
update_post_meta( $post_id, 'your_key', $post_meta );
echo 'Meta Updated';
die();
} // end of my_ajax_callback()