web-dev-qa-db-ja.com

'draft_to_publish'フックを使用する(投稿ステータス遷移)

下書きである投稿があるときに関数を実行するためにdraft_to_publishフック( http://codex.wordpress.org/Post_Status_Transitions )を使用しようとしています公開されます。このフックは機能していないようです。

add_action('draft_to_publish', 'myFunction');

プラグインでこれを使用すると、myFunctionは起動されません。私は以前にこの機能を使用/テストしました。私はそれがフックであり、myFunctionの内容ではないことを知っています。

私が見つけたすべての '解決策'は上のCodexページにリンクしているだけです。このフックが機能しない理由について何かアイデアはありますか?

編集:これは例です。アクションが実行されないため、電子メールは送信されません。

function myfunction () {
        $to = "[email protected]";
        $subject = "Hi!";
        $body = "Hi,\n\nHow are you?";
        if (mail($to, $subject, $body)) {
          echo("<p>Message successfully sent!</p>");
         } else {
          echo("<p>Message delivery failed...</p>");
         }
    }
add_action('draft_to_publish', 'myFunction');
2
AndrewJM

あなたは確かに正しいフックを持っていますが、あなたは自分の機能を特にdraft_to_publishアクション、すなわちデータベース内に既に存在しているポストオブジェクトのdraftステータスがpublishに更新されるという特定のケースにフックしていることに注意してください。このアクションは、新しい投稿が作成されたときにWordpressによって自動的に保存された下書きを無視します - これらの「下書き」はpost_statusauto-draftを持ちます。

この時点までに問題をデバッグしてきた方法は正確にはわかりませんが、まだ行っていない場合は、アクション自体が期待通りに起動していることを確認することをお勧めします。そしてそれに対する明白な機能:

function kill_wp( $post ) {
  die( 'draft_to_publish fired for post #' . $post['ID'] . ' entitled, "' . $post['post_title'] . '"' );
}
add_action( 'draft_to_publish', 'kill_wp' );

そうは言っても、あなたの問題の一部は大文字化にあるかもしれません - あなたの例のアクションコールバックはmyFunctionという関数を参照していますが、定義されている関数はmyfunctionという名前です。

何を達成しようとしているのかよくわかりませんが、代わりに 一般的なアクションtransition_post_status に機能を付加することもできます。新しい投稿のステータス、以前の投稿のステータス、投稿オブジェクト

function wpse77561_mail_on_publish( $new_status, $old_status, $post ) {
  if (get_post_type($post) !== 'post')
        return;    //Don't touch anything that's not a post (i.e. ignore links and attachments and whatnot )

    //If some variety of a draft is being published, dispatch an email
    if( ( 'draft' === $old_status || 'auto-draft' === $old_status ) && $new_status === 'publish' ) {
        $to      = '[email protected]';
        $subject = 'Hi!';
        $body    = 'Hi,' . chr(10) . chr(10) . 'How are you?';

        if( wp_mail( $to, $subject, $body ) ) {
            echo('<p>Message successfully sent!</p>');
        } else {
            echo('<p>Message delivery failed...</p>');
        }
    }
}
add_action('transition_post_status', 'wpse77561_mail_on_publish');

アクションフックインスペクタ のようなWordpressのアクション実行についてのより多くの洞察をあなたに与えるかもしれない利用可能な多くのツールもあります デバッグバー プラグイン。

9
bosco