• 解決済 thds

    (@thds)


    add_actionでアクションフックを使用しようとしています。
    他の方が作られたコードを丸々コピペした場合は問題無く動くのですが、
    それを全く同じように真似て自分で手打ちすると動作しなくなってしまいます。

    何百と見返しても誤字脱字などは無く、ユーザー定義関数内をecho “test”;のみにしてみても実行されません。
    コピペしたコードの一部を書き換えても動作しなくなります。例えばアクションフックを変更したりユーザー定義関数の名前を変えてみたりです。
    アクションフックを’all’にするといずれも動作するので、間違っているとすればアクションフックのはずなのですが、どう見ても確実に、間違いなくコピペしてきたものと同一でも動作しないのです。

    こんな事があるものなのでしょうか?
    もし何か理由など心当たりがありましたら是非ともご教授願います。

    add_action( 'trash_thread', 'trash_child_post' );
    //他の方が作られたのをコピペしたものです。これは動きます。
    
    add_action( 'untrash_post', 'untrash_child_post' );
    //アクションフックと関数名を改変したものです。これは動きません。
    
    add_action( 'trash_thread', 'untrash_child_post' );
    //関数名だけ改変したものです。これも動きません。
    
    add_action( 'all', 'untrash_child_post' );
    //アクションフックをallにしたものです。これは動きます。
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • 普通に考えればそんなことはないはずです。
    動かないとはどのようになって動かなくなるのでしょうか?
    ・エラー
    ・期待した動きをしない。

    エラーの場合でしたらまずエラーコード、もしくはサーバのエラーログの確認です。
    期待した動きをしないの部分でしたら自分で作った関数のエラーになります。
    ただ、wordpressのみではtrash_thredというフックが見当たらないのですが
    例えばリダイレクトしたりなどするような場合などもあるので
    exit();
    で処理を止めてみるなどしてみるとまずフックが効いているかどうか判断できると思います。

    トピック投稿者 thds

    (@thds)

    ありがとうございます。
    exit();でデバッグしたところ、多少の進展がありました。

    手打ち云々の問題では無い事は分かりましたが、
    問題は一向に解決されず、どうしたものかと悩んでおります。

    add_action( 'untrash_post', 'action_test' );
    function action_test( $post_id ) {
    	$check_post_type=get_post($post_id);
    	if($check_post_type->post_type=='test'){
    		$children=get_children(array('post_type'=>'test','post_parent'=>$post_id ));
    		function exit_test($test){print_r($test);}
    		exit(exit_test($children));
    	}
    }

    これでpost_typeがtestの投稿をゴミ箱から復元すると、復元しようとしている投稿記事の子記事を取得し、中身($children)が表示されます。
    しかしアクションフックをdelete_postに変えた瞬間に、子記事が取得できなくなります。
    ゴミ箱から「完全に削除する」をクリックすると、exit_test内がprint_rだと何も表示されず、var_dumpだとnullと表示されます。
    $post_idまでは正常に取得できているようですが、何故かget_childrenに失敗してしまいます。
    もちろん「完全に削除する」際に子記事は存在しています。ただ取得だけが出来ません。
    アクションフックをuntrash_postに戻すと正常に動作します。

    untrash_postとdelete_post、返り値か何かに違いがあるのでしょうか?
    元の質問内容と異なってしまい申し訳ないのですが、ご返答よろしくお願いします。

    delete_postが動作するタイミングによるものだと思います。

    wp-includes/post.php
    delete_postは本当に削除する直前と直後の2か所にフックされており、
    それ以前にはすでに子ページの親子関係が削除されているため
    子記事が取得できていないと思われます。

    この場合には
    delete_postではなく
    before_delete_post
    を使うと期待した動きになると思います。

    トピック投稿者 thds

    (@thds)

    ありがとうございます!
    before_delete_postで問題無く動作しました!

    また、get_childrenのpost_status=anyが、
    ゴミ箱内まで対象としていないようで、今まで勘違いしておりました。
    any&trashで問題なくゴミ箱内外の子記事を取得できました。
    本当にありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「コピペしたコードは動き、手打ちのコードが動かない」には新たに返信することはできません。