我想创建一个插件来批量管理帖子的自定义字段数据。我知道我可以通过在帖子编辑屏幕中添加一个元框来添加帖子元,并使用 add_action('save_post','function_to_update_meta') 来触发添加元函数。
但我不知道如何在管理菜单页面(例如自定义管理菜单)中触发 add_post_meta 功能。怎么做?
先感谢您!
Wordpress 的 codex 中给出的示例可能是处理信息方式中最好和最安全的:
复制并粘贴它,然后摆弄它,以了解如何控制您的帖子和页面。
好的部分是您无需担心检查是否需要添加和更新给定的 Post Meta 字段。使用Update Post Meta将确保为您采取正确的操作,即使该字段不存在。
如果您想添加一些您的插件/主题可能使用的全局控件,更新选项也是如此。
故障示例:
add_action( 'add_meta_boxes', 'myplugin_add_custom_box' );
add_action( 'save_post', 'myplugin_save_postdata' );
这些是动作钩子。第一个在帖子编辑器中填充元框时执行,第二个在添加或更新帖子时执行。
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”操作挂钩调用。注意函数的名字和动作钩子的第二个参数是完全一样的。这会注册您的元框,它们应该出现的帖子类型,以及用于生成包含在其中的表单的回调。
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”的,并且您的元框注册中的第三个参数也称为“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”操作挂钩调用的函数。注意第二个动作钩子的第二个参数和这个函数都被称为“myplugin_save_postdata”。首先,我们的插件必须通过一系列验证才能真正保存任何数据。
首先,我们不希望我们的元框在每次给定帖子自动更新时更新。如果帖子正在自动更新,请取消该过程。
其次,我们要确保 nonce 数据可用并进行验证。如果没有可用的随机数数据或未经验证,则取消该过程。
第三,我们要确保给定用户具有 edit_page 权限。该函数首先检查帖子类型,然后检查相应的权限。如果用户没有该权限,请取消该过程。
最后,我们的插件终于通过了验证,我们要保存信息。我冒昧地添加了最后的 update_post_meta() 行,以向您展示这一切是如何结合在一起的。
注意 $post_id 是如何作为参数传递给函数的。这是 update_post_meta() 函数所需的部分之一。该键名为“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()