我正在使用RW_Meta_Box 插件依据Rilwis.
我正在使用CPT,添加了一个自定义元框,并删除了title
和editor
.
但我还是想确定标题,原因很明显。
我创建了CPT和meta box,一切都很好,包括all posts
页面使用custom column
挂钩。
当我坐下来为元框中的一个字段设置帖子标题时,我没有得到想要的结果。我试图通过搜索此Q&;来找到我选择的解决方案;一个站点。
最初我尝试:
SOLUTION1:
add_action(\'submitpost_box\', \'hidden_type_title\');
function hidden_type_title() {
global $current_user, $post, $post_type;
global $prefix;
$md = rwmb_meta($prefix . \'name\', array(\'type\' => \'text\'), $post->ID);
if ($post->post_type == \'MY_CPT_NAME\') {
?>
<input type="hidden" name="post_title" value="<?php echo esc_attr(htmlspecialchars($md)); ?>" id="title" />
<?php
} else {
return;
}
}
上面的代码工作正常,但有一个我无法检测到的问题。也就是说,我需要更新两次帖子才能设置帖子标题。
因此,我继续尝试save_post
像这样钩住:
SOLUTION2:
add_action(\'save_post\', \'post_updated\');
function post_updated($post_id) {
global $current_user, $post;
if ($post->post_type != \'MY_CPT_NAME\') {
return;
}
global $prefix;
$md = rwmb_meta($prefix . \'name\', array(\'type\' => \'text\'), $post_id);
// verify post is not a revision & not an autosave
if (!wp_is_post_revision($post_id) && !(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)) {
// set the new post title
$post->ID = $post_id;
$post->post_title = $md;
// update the post, removing the action to prevent an infinite loop
remove_action(\'save_post\', \'post_updated\');
wp_update_post($post);
add_action(\'save_post\', \'post_updated\');
return;
}
}
现在,我的处境更糟了,帖子标题立即设置好了,但我的元框数据不知何故没有被保存。
第一个解决方案可能有什么问题?
最合适的回答,由SO网友:helgatheviking 整理而成
这里有一个利用Rilwis动作钩的解决方案。。。因此,您可以从他的临时支票中获利,而无需添加您自己的支票。
add_action(\'rwmb_after_save_post\', \'post_updated\');
function post_updated($post_id) {
// verify post is not a revision & not an autosave
if (!wp_is_post_revision($post_id) && !(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)) {
global $prefix;
$prefix . \'name\';
// check that the custom field is being POSTED
if( isset( $_POST[$prefix . \'name\'] ) ){
$my_post = array();
$my_post[\'ID\'] = $post_id;
$my_post[\'post_title\'] = sanitize_title( $_POST[$prefix . \'name\'] );
// Update the post into the database
wp_update_post( $my_post );
}
}
}
要将此函数限制为仅针对特定的metabox运行,可以使用
add_action
而是:
add_action("rwmb_{$meta_box[\'id\']}_after_save_post", \'post_updated\');
没有看到您的metabox定义,我不知道要将ID更改为什么,因此您必须这样做。
NB:未经测试,但我认为很接近。请参见wp_update_post()
在codex中介绍了该函数的工作原理。