由于自定义帖子类型,页面未保存

时间:2015-03-24 作者:user2954969

我有一个自定义的帖子类型“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。

我在保存页面时遇到的主要问题。如果我创建了一个新页面,然后保存它,那么它从未保存为“发布”,而是始终保存为“草稿”。现在,如果我删除上述代码,那么页面似乎可以正常工作。

为什么上面的代码会影响页面部分。?还是有其他代码来满足我的需要?

1 个回复
最合适的回答,由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;

    ...
现在,该例程将进行额外的检查,并将保存的帖子类型与应用自定义元框的帖子类型进行比较。如果他们不匹配,就不会继续。这意味着页面(和帖子)将来不会受到该功能的影响。

(注意:我不知道你的帖子类型的名称,所以我在上面猜到了…)

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register