web-dev-qa-db-ja.com

`save_post`をフックするためのプラグインへのコードの配置

私は新しいプラグインを開発している今日、奇妙な問題に遭遇しました。

私はいつものようにセットアップし、Plugindirectoryにf711-roompriceフォルダを作成し、そこにf711-roomprice.phpincディレクトリを作成します。

私がインクルードを作成するまで、すべてがアクティベーションフックとインクルード関数でうまくいきました:

include('inc/filter-savepost.php');

このファイルには次のコードが含まれていました。

add_action( 'save_post', 'f711_roomprice_meta_box_save' );  
function f711_roomprice_meta_box_save( $post_id ) {

    if( !isset( $_POST['f711_roomprice_prices'] ) ) return;

    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; 

    if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'f711_roomprice_box_nonce' ) ) return; 

    if( !current_user_can( 'edit_post', $post_id ) ) return;

    foreach( $_POST['f711_roomprice_prices'] as $room => $seasons ) {
        foreach( $seasons as $season => $price ) {

            f711_roomprice_insert( $room, $season, $price );

        }

    }

}  

私のメインプラグインファイルにファイルを含めた後、私はエラーを得て、投稿を保存する上で白いスクリーンをもたらしました、他はすべてうまくいきました。

関数f711_roomprice_meta_box_saveが呼び出され、そこにwp_die('f711_roomprice_meta_box_saveis called')を付けてこれを確認しました。

今度は奇妙なことに、私はメインのプラグインファイルにコードを含め(インクルードファイルとまったく同じ)、もちろんインクルードをスキップしました。今それは私がしたいのと同じように動作します。

また、メインのPluginファイルにsave_postアクションを追加してinc/filter-savepost.phpの関数を含めてみたところ、以前と同じように間違った結果が得られました。

私はここで何をしていますか?コード(フック、関数)の配置はプラグイン内で本当に重要ですか、それとも私の側では間違っているのでしょうか。

2
fischi

私のこれまでの質問を拾い読みして、私はこれを再び開いて、そして私のプラグインの中でいくつかのことをテストしました。

解決策は非常に単純でしたが、WordPressの新しいバージョンにも関係があるかどうかはわかりません。

私はプラグインをリファクタリングし、これをテストした前回とは異なるエンコーディングに気付きました。私はこれをどうやって認識しなかったのかわかりません。さて、すべてがUTF-8 without BOMであり、そして(それが計画されていたように)うまく異なったファイルに構造化されているので、それはうまく働きます。

0
fischi

わからない

if( !current_user_can( 'edit_post', $post_id ) ) return;

本当にうまくいきます。現在のユーザーがそこに設定されていないのかもしれませんし、隠しフィールドにユーザーIDを渡してからそれを使用して取得することでそれを回避する必要があります。

$user = get_user_by( 'id', esc_attr( $_POST['user_id'] ) );
wp_set_current_user( $user->user_id );
if ( ! current_user_can( 'edit_post', $post_id )
    wp_die( 'Not allowed' );
0
kaiser