2つのカスタムフィールドがアタッチされたカスタム投稿タイプを作成しました。このタイプの投稿を作成してカスタムフィールドに入力すると、データは実際にはdbに保存されます。そのうちの1つを捨てると、その投稿のカスタムフィールドデータがデータベースから削除されます。
私はゴミ箱は単にpost_statusを "trash"に変更することになっていると思ったので、実際に完全に削除しない限りそれは見えないのですか?
その場合、アイテムをゴミ箱に捨てるとカスタムフィールドのデータが失われるのはなぜですか?
上記の質問に関連するすべてのコードは次のとおりです。
<?php
add_action('admin_init', 'wpg_add_testimonial_author');
function wpg_add_testimonial_author() {
add_meta_box('wpg_testimonial_author', __('Author Information', 'quotable'), 'wpg_testimonial_author', 'testimonials', 'side', 'low');
}
function wpg_testimonial_author() {
global $post;
$custom = get_post_custom($post->ID);
$testimonial_author_name = $custom['testimonial_author_name'][0];
$testimonial_author_link = $custom['testimonial_author_link'][0];
?>
<p>
<label><?php _e("Author's Name:", 'quotable'); ?></label>
<input name="testimonial_author_name" value="<?php echo $testimonial_author_name; ?>" />
</p>
<p>
<label><?php _e('Attribution Link:', 'quotable'); ?></label>
<input name="testimonial_author_link" value="<?php echo $testimonial_author_link; ?>" />
</p>
<?php
}
function wpg_save_testimonial_author() {
global $post;
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
if (defined('DOING_AJAX')) {
return;
}
update_post_meta($post->ID, 'testimonial_author_name', $_POST['testimonial_author_name']);
update_post_meta($post->ID, 'testimonial_author_link', $_POST['testimonial_author_link']);
}
add_action('save_post', 'wpg_save_testimonial_author');
function wpg_row_actions() {
global $post;
if($post->post_type == 'page') {
if(!current_user_can('edit_page')) {
return;
}
}
else {
if(!current_user_can('edit_post')) {
return;
}
}
if($post->post_status == 'trash') {
$actionLinks = '<div class="row-actions"><span class="untrash"><a title="'.__('Restore this item', 'quotable').'" href="'.wp_nonce_url(get_admin_url().'post.php?post='.$post->ID.'&action=untrash', 'untrash-'.$post->post_type.'_'.$post->ID).'">'.__('Restore', 'quotable').'</a> | </span>';
$actionLinks .= '<span class="trash"><a href="'.wp_nonce_url(get_admin_url().'post.php?post='.$post->ID.'&action=delete', 'delete-'.$post->post_type.'_'.$post->ID).'" title="'.__('Delete this item permanently', 'quotable').'" class="submitdelete">'.__('Delete Permanently', 'quotable').'</a></span>';
}
else {
$actionLinks = '<div class="row-actions"><span class="edit"><a title="'.__('Edit this item', 'quotable').'" href="'.get_admin_url().'post.php?post='.$post->ID.'&action=edit">'.__('Edit', 'quotable').'</a> | </span>';
$actionLinks .= '<span class="inline hide-if-no-js"><a title="'.__('Edit this item inline', 'quotable').'" class="editinline" href="#">'.__('Quick Edit', 'quotable').'</a> | </span>';
$actionLinks .= '<span class="trash"><a href="'.wp_nonce_url(get_admin_url().'post.php?post='.$post->ID.'&action=trash', 'trash-'.$post->post_type.'_'.$post->ID).'" title="'.__('Move this item to the Trash', 'quotable').'" class="submitdelete">'._x('Trash', 'verb (ie. trash this post)', 'quotable').'</a></span>';
}
return $actionLinks;
}
function wpg_edit_testimonials_columns($columns) {
$columns = array(
'cb' => '<input type="checkbox" />',
'testimonial_author' => __('Author', 'quotable'),
'testimonial_text' => __('Testimonial', 'quotable'),
'attribution_link' => __('Attribution Link', 'quotable'),
'date' => __('Date Added', 'quotable')
);
return $columns;
}
function wpg_manage_testimonials_columns($column, $post_id) {
global $post;
$custom = get_post_custom($post->ID);
$testimonial_author_name = $custom['testimonial_author_name'][0];
$testimonial_author_link = $custom['testimonial_author_link'][0];
$wpg_row_actions = wpg_row_actions();
switch($column) {
case 'testimonial_author':
echo $testimonial_author_name.$wpg_row_actions;
break;
case 'testimonial_text':
echo $post->post_content;
break;
case 'attribution_link':
echo $testimonial_author_link;
break;
default :
break;
}
}
add_filter('manage_edit-testimonials_columns', 'wpg_edit_testimonials_columns');
add_action('manage_testimonials_posts_custom_column', 'wpg_manage_testimonials_columns', 10, 2);
カスタム投稿タイプは投稿の「タイトル」部分をサポートしないため、投稿編集ページの列の1つとして含まれていません。そのため、投稿ごとに編集/クイック編集/ゴミ箱へのリンクを有効にするには、独自のrow_actions()関数をハッキングする必要がありました。
すべての機能は本来の機能を果たします。投稿をゴミ箱に移動すると、「紹介文」および「帰属リンク」の値がデータベースから削除されることを除きます。なぜだかわからない….
ゴミ箱に投稿を送信すると、save_postアクションが実行されるようです。したがって、私のカスタムメタデータ保存機能は、$ _POSTデータを送信せずにアクティブにされていました。
これを回避するために、save関数にnonceを追加しました。
function wpg_testimonial_author() {
global $post;
$custom = get_post_custom($post->ID);
$testimonial_author_name = $custom['testimonial_author_name'][0];
$testimonial_author_link = $custom['testimonial_author_link'][0];
?>
<p>
<label><?php _e("Author's Name:", 'quotable'); ?></label>
<input name="testimonial_author_name" value="<?php echo $testimonial_author_name; ?>" />
</p>
<p>
<label><?php _e('Attribution Link:', 'quotable'); ?></label>
<input name="testimonial_author_link" value="<?php echo $testimonial_author_link; ?>" />
<input type="hidden" name="testimonial_author_noncename" id="testimonial_author_noncename" value="<?php echo wp_create_nonce(plugin_basename(__FILE__).$post->ID); ?>" />
</p>
<?php
}
function wpg_save_testimonial_author($post_id) {
global $post;
if (!wp_verify_nonce($_POST['testimonial_author_noncename'], plugin_basename(__FILE__).$post->ID)) {
return $post->ID;
}
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
if(defined('DOING_AJAX')) {
return;
}
if(!current_user_can('edit_post')) {
return $post->ID;
}
if($post->post_type == 'revision') {
return;
}
update_post_meta($post->ID, 'testimonial_author_name', $_POST['testimonial_author_name']);
update_post_meta($post->ID, 'testimonial_author_link', $_POST['testimonial_author_link']);
}
add_action('save_post', 'wpg_save_testimonial_author');
うまくいけば、これは後で他の誰かに役立つかもしれません...
Nero_DCLXVI、ありがとうございます。非常に役立ちます。これを実装しようとしている将来の人々のために、これが彼の解決策の簡単な説明です:
<input type="hidden" name="prevent_delete_meta_movetotrash" id="prevent_delete_meta_movetotrash" value="<?php echo wp_create_nonce(plugin_basename(__FILE__).$post->ID); ?>" />
if (!wp_verify_nonce($_POST['prevent_delete_meta_movetotrash'], plugin_basename(__FILE__).$post->ID)) { return $post_id; }
私は同じ問題にぶつかり、さらに短い解決策(執筆の観点から)を見つけました。
if (isset($_POST['action']) && $_POST['action'] == 'editpost') {
// do your update_post_meta, delete_post_meta, etc.
}
5+ WPバージョンで今すぐテストしようとしましたが、新しい投稿を編集または保存するときにのみ起動するようです。