我有一个自定义的帖子类型“soto\\u user”。在其中,我有一个名为“Publish”的自定义元字段,用户可以从中选择“YES”或“No”。如果用户选择“是”并单击“发布”按钮,则应发布帖子;如果用户选择“否”并单击“发布”按钮,则帖子应另存为草稿。
function sotoUserManagement( $post ) // function that echo custom meta field in CPT
{
$values = get_post_custom( $post->ID );
$post_status=get_post_status($post->ID);
$publish=\'\';
if($post_status==\'publish\'){$publish=1;}
if($post_status==\'draft\'){$publish=0;}
?>
<table id="sotoUserManagementTable" class="sotoUserTable">
<tr>
<td>
<label for="publish">Publish</label>
<select name="publish" id="publish">
<option value="1" <?php selected( $publish, 1 ); ?>>Yes</option>
<option value="0" <?php selected( $publish, 0 ); ?>>No</option>
</select>
</td>
<td>
</td>
</tr>
</table>
<?php
}
add_action( \'save_post\', \'soto_user_meta_box_save\' ); //calls on Click Publish Button
function soto_user_meta_box_save( $post_id )
{
// Bail if we\'re doing an auto save
if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
// if our nonce isn\'t there, or we can\'t verify it, bail
// if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'my_meta_box_nonce\' ) ) return;
// if our current user can\'t edit this post, bail
if( !current_user_can( \'edit_post\' ) ) return;
// Make sure your data is set before trying to save it
if($_POST[\'publish\'] == 1 && get_post_status($post_id) != \'publish\' && get_post_type( $post_id ) == \'soto_user\'){ //whatever your post variable is
remove_action(\'save_post\', \'soto_user_meta_box_save\'); //if you don\'t unhook the function you\'ll have an infinite loop
wp_publish_post($post_id);
add_action(\'save_post\', \'soto_user_meta_box_save\'); //rehook the function
}
if($_POST[\'publish\'] == 0 && get_post_status($post_id) == \'publish\' && get_post_type( $post_id ) == \'soto_user\'){
remove_action(\'save_post\', \'soto_user_meta_box_save\'); //if you don\'t unhook the function you\'ll have an infinite loop
wp_update_post(array(
\'ID\' => $post_id,
\'post_status\' => \'draft\'
));
add_action(\'save_post\', \'soto_user_meta_box_save\'); //rehook the function
}
}
从上面的代码可以看出,如果我保存自定义帖子,那么它工作意味着如果自定义字段“PUBLISH”设置值为“YES”,它将帖子另存为PUBLISH,如果自定义字段“PUBLISH”选择为“NO”,它将帖子另存为DRAFT。
我在保存页面时遇到的主要问题。如果我创建了一个新页面,然后保存它,那么它从未保存为“发布”,而是始终保存为“草稿”。现在,如果我删除上述代码,那么页面似乎可以正常工作。
为什么上面的代码会影响页面部分。?还是有其他代码来满足我的需要?
最合适的回答,由SO网友:EAMann 整理而成
问题在于soto_user_meta_box_save
作用此功能与save_post
操作,这意味着它将在保存任何帖子类型的任何帖子时触发,而不仅仅是您的自定义帖子类型。
您需要在此函数中添加一个检查,以便在测试错误的post类型时中止:
function soto_user_meta_box_save( $post_id ) {
// Bail if we\'re doing an auto save
if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
// if our nonce isn\'t there, or we can\'t verify it, bail
// if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'my_meta_box_nonce\' ) ) return;
// if our current user can\'t edit this post, bail
if( !current_user_can( \'edit_post\' ) ) return;
// if this isn\'t the right post type, bail
if ( \'soto_post_type\' !== get_post_type( $post_id ) ) return;
...
现在,该例程将进行额外的检查,并将保存的帖子类型与应用自定义元框的帖子类型进行比较。如果他们不匹配,就不会继续。这意味着页面(和帖子)将来不会受到该功能的影响。
(注意:我不知道你的帖子类型的名称,所以我在上面猜到了…)