web-dev-qa-db-ja.com

'save_post'アクションをデバッグする方法

PHPコードを検証することは可能ですか?

カスタムメタボックス付きのカスタムポストタイプ(フィルム)があります。

すべてが問題なく機能しているので、カスタムメタボックスに新しいフィルムと詳細を追加できます。

私の問題は更新ボタンにあります。新しい映画を作成する場合は、情報を追加して[更新]をクリックし、白い画面にします。

Function.phpとカスタム投稿タイプに問題があることを知っていますが、どうすれば間違いを見つけることができますか?

ホワイトページのソースを確認すると、2行の空白行が表示されますが、コードには先頭または末尾の空白行はありません。

    <?php
        add_action( 'admin_print_styles-post-new.php', 'film_style', 11 );
        add_action( 'admin_print_styles-post.php', 'film_style', 11 );

        function film_style() {
            global $post_type;
            if( 'films' == $post_type )
                wp_enqueue_style( 'film-style', get_stylesheet_directory_uri() . '/css/filmMetaBox.css');
        }
    ?>

    <?php
        add_action('init', 'film_init');
        function film_init(){
            $film_labels = array(
                'name' => _x('Film', 'post type general name'),
                'singular_name' => _x('Films', 'post type singular name'),
                'all_items' => __('All Films'),
                'add_new' => _x('Add new Film', 'film'),
                'add_new_item' => __('Add new Film'),
                'edit_item' => __('Edit Film'),
                'new_item' => __('New film'),
                'view_item' => __('View film'),
                'search_items' => __('Search in films'),
                'not_found' =>  __('No films found'),
                'not_found_in_trash' => __('No films found in trash'), 
                'parent_item_colon' => ''
            );
            $args = array(
                'labels' => $film_labels,
                'public' => true,
                'publicly_queryable' => true,
                'show_ui' => true,
                'query_var' => true,
                'rewrite' => true,
                'capability_type' => 'post',
                'hierarchical' => false,
                'menu_position' => null,
                'supports' => array('title','editor'),
                'has_archive' => 'films',
                'register_meta_box_cb' => 'cd_meta_box_add'
            );
            register_post_type('films',$args);
        }
    ?>
    <?php
        add_action( 'add_meta_boxes', 'cd_meta_box_add' );
        function cd_meta_box_add(){
          add_meta_box( 'my-meta-box-id', 'Film Credits', 'cd_meta_box_cb', 'films', 'normal', 'high' );
        }

        function cd_meta_box_cb( $post ){
          $values = get_post_custom( $post->ID );

          $title = isset( $values['meta_box_title'] ) ? esc_attr( $values['meta_box_title'][0] ) : '';
          $director = isset( $values['meta_box_director'] ) ? esc_attr( $values['meta_box_director'][0] ) : '';
          $desc = isset( $values['meta_box_desc'] ) ? esc_attr( $values['meta_box_desc'][0] ) : '';

          wp_nonce_field( 'my_meta_box_nonce', 'meta_box_nonce' );

          ?>
            <div id="filmMeta">
              <p>
                  <label for="meta_box_title" class="label">Film Title</label>
                  <input type="text" name="meta_box_title" id="meta_box_title" class="textInput" value="<?php echo $title; ?>" />
              </p>
              <p>
                  <label for="meta_box_title" class="label">Director</label>
                  <input type="text" name="meta_box_director" id="meta_box_title" class="textInput" value="<?php echo $director; ?>" />
              </p>
              <p>
                  <label for="meta_box_desc" class="label">Description</label>
                  <textarea name="meta_box_desc" id="meta_box_desc" class="textInput" col="100" row="5"><?php echo $desc; ?></textarea>
              </p>
            </div>
          <?php
        }

        add_action( 'save_post', 'cd_meta_box_save' );
        function cd_meta_box_save( $post_id ){
          if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;// Bail if we're doing an auto save

          // 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( !current_user_can( 'edit_post' ) ) return;// if our current user can't edit this post, bail

          $allowed = array( // now we can actually save the data
              'a' => array( // on allow a tags
                  'href' => array() // and those anchords can only have href attribute
              )
          );

          if( isset( $_POST['meta_box_title'] ) )//if data set save it.
              update_post_meta( $post_id, 'meta_box_title', wp_kses( $_POST['meta_box_title'], $allowed ) );
          if( isset( $_POST['meta_box_director'] ) )
              update_post_meta( $post_id, 'meta_box_director', wp_kses( $_POST['meta_box_director'], $allowed ) );
          if( isset( $_POST['meta_box_desc'] ) )
              update_post_meta( $post_id, 'meta_box_desc', wp_kses( $_POST['meta_box_desc'], $allowed ) );
        }
    ?>
4
user668499

あなたのコードは私の側では問題なく動作します。だから、私はあなたの問題は他にあると思います。

トラブルシューティングガイド

標準の debugging または FirePHP を使用できます。私はまた、FirePHPが情報を表示しない場合、すなわちsave_postのために以下を使います。

function my_log( $msg, $title = '' )
{
    $error_dir = '/Applications/MAMP/logs/php_error.log';
    $date = date( 'd.m.Y h:i:s' );
    $msg = print_r( $msg, true );
    $log = $title . "  |  " . $msg . "\n";
    error_log( $log, 3, $error_dir );
}

そしてあなたのアクションコールバックの内側:my_log( $_POST, 'Contents of $_POST' );


私の知る限りでは、 "validate PHP"のようなものはありません。
あなたが書いている間にエラーを表示するエディタがあります: http://www.jetbrains.com/phpstorm/

4
brasofilo

方法1:

add_action('save_post', 'something_process1');  function something_process1() {
   if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
   print_r($_POST);
}

方法2:

このコードを使用するフォルダにログファイル( my_logs.txt )を作成します。

add_action('save_post', 'something_process2',11);   function something_process2() {
    print_r($_POST);
    file_put_contents(dirname(__file__).'/my_logs.txt', "\r\n\r\n".ob_get_contents(), FILE_APPEND);
}
0
T.Todua

あなたがsave_postコールバックでvar_dump()値を必要とするならば、そこに単にexit;を入れてください:

add_action( 'save_post', 'cd_meta_box_save' );
function cd_meta_box_save( $post_id )
{
    $post = get_post( $post_id );
    // do abort checks
    if (
        wp_is_post_revision( $post );
        OR wp_is_post_autosave( $post );
        OR ! wp_verify_nonce( ... )
        OR ... etc.
    )
        return;

    exit( var_dump( $post, $_POST ) );
}
0
kaiser