このチュートリアル に従ってカスタム投稿タイプを設定しようとしています。しかしながら、私はupdate_post_meta()
をどのように/どこで実装するべきかと少し混乱しています。チュートリアルはこのパターンを示唆しています:
add_action('save_post', 'save_my_metadata');
function save_my_metadata()
{
global $post;
update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}
これは機能しますが、メタデータがこのカスタムタイプに属しているかどうかにかかわらず、すべての投稿にそのメタデータを追加するという不幸な効果があります。
上記をfunctions.php
に入れましたが、それが問題の一部かもしれないと思います。 「save_post」アクションを自分のカスタムタイプの投稿のみをトリガーするように制限する必要があると思います。
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']);
}
それはうまくいくはずです。 'your_post_type'を投稿タイプの名前に置き換えてください。また、ほとんど知られていない事実: 'save_post'フックは投稿のIDを引数として渡します。
編集
Janのコメントを反映するように機能を更新しました。ありがとうJan
複数の投稿タイプを処理したい場合は、基本的なswitchステートメントをお勧めします。
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;
}
}
ケースは基本的にif($post->post_type) == 'post_type_1') {}
と同じですが、複数のif-elseブロックを必要としないでください。スイッチ内のdefault
ブロックは、投稿タイプがカスタムセットにない場合を処理します。
@ John P Blochと@EAMannはすでにすばらしい回答をしています。
function save_my_metadata($ post_id、$ post = false){ if($ post-> post_type == 'your_post_type') update_post_meta($ post_id、 '_my_metadata'、$ _POST ['my_metadata' ]); }もちろん、フィールドを編集できるようにするにはカスタムメタボックスが必要です。これがコンテキスト用の編集画面です。
save_{$post_type}_post
"であるかもしれません。 movie
投稿タイプの場合はsave_movie_post
になります。テーマのfunctions.php
ファイルまたはプラグインのどこかに追加する必要があるものは次のとおりです。add_action( 'save_post'、 'save_custom_post_type_posts'、10,2); 関数save_custom_post_type_posts($ post_id、$ post = false){ do_action( "save _ {$ post- > post_type} _post "); }それであなたはオリジナルのコードをそのように書き直すことができます(上記の#1のアンダースコアトリックを含む):
add_action( 'save_my_postype_post'、 'save_my_postype_metadata'、10,2); 関数save_my_postype_metadata($ post_id、$ post){ update_post_meta($ post_id、 '_my_metadata'、$ _POST ['my_metadata']); }
個人的には、投稿タイプにカスタムメタハンドラを追加するために、以下のパターンに従うことを好みます。以下では、add_post_type_support( 'my_post_type'、 'subtitle')を呼び出して、サポートタイプ(次の例では 'subtitle')を投稿タイプのsupports配列に追加するだけで、投稿タイプにメタサポートを追加できます。
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'));
うまくいけば、このようなものはすぐにコアに追加されます。
他のカスタムフィールドから値を取得できるように、投稿が更新された後にこれらの値を挿入する必要があるため、これを機能させることはできません。 。
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');
前回の更新で、現在の投稿があなたの投稿タイプであるかどうかを確認してください。それはあなたがすべての投稿のためにそれを保存しないのを確実にするでしょう。
入力も確認してください(これはあなたの例では欠けています)。その横に、その投稿タイプがアクティブなときにのみアクションを追加できることに注意してください。その場合は、後で投稿タイプを確認する必要はありません。
投稿タイプを取得する: get_post_type()
または$post->post_type;