前提・実現したいこと
公開中の記事を公開したまま、編集して承認待ちにできるようにしたい。
なので、
https://www.nishi2002.com/10468.html
のような方法で、ブランチを作って別記事として作って、それを編集してもらうという形にしたい。
しかし、上の記事で使っているプラグイン「WP Post Branches」は最新3回のメジャーリリースに対してテストされていないので、
今回の案件では使えません。
https://ja.wordpress.org/plugins/wp-post-branches/
なので、これと同じようなものを作ろうとおもいました。
(実際に作りたいものは公開権限がない人は公開済みのものを編集するときは、公開する事ができず、強制的にブランチを切って承認待ちとして保存するようにしたいので、WP Post Branchesを改造する形になります。)
上の調査過程で、また別の機能を実装しているときに、アクションフックやフィルターフックの引数がリファレンスのものと比べて足りません。これがどうして起こっているのかが知りたいです。こちらの疑問を解消したいというのがどちらかというと主題です。下で見ているようにリファレンスのほうが間違っているような気がするのですが、正しい情報はどこかで見ることができるでしょうか? また、これはいつからこうなっているのでしょうか?
発生している問題・エラーメッセージ
まず、WP Post Branchesでは「ブランチを作成」を押したときにはore_post_update
フックで、編集された投稿をコピーして、新しい投稿として保存しています。その後リダイレクトしてexit
することで、元の記事に対する編集はしないようになっています。ざっと下のような処理をしています。
php
1add_filter('pre_post_update', function($id){ 2 if(isset($_POST['wp_post_branches'])){ // wp_post_branchesは「ブランチを作成」のname 3 $pub = get_post($id); 4 // $pubのIDを除いた項目をコピーして、名前にブランチであることを追加し、post_statusを変更する 5 $draft_id = wp_insert_post($put); 6 // その後postmetaやtaxonomyもコピーする 7 add_post_meta($draft_id, '_wpbs_pre_post_id', $id); // コピー元のidを保存しておく 8 wp_safe_redirect(admin_url('post.php?post=' . $draft_id . '&action=edit')); 9 exit; 10 } 11});
しかし、ここで取得した$pub
は、変更前の情報しか入っていないので、これを実行しても、新しく作った投稿は、編集前のコピーになってしまいました。
なので、編集前と編集後の情報を取れるpost_updated
を使えないかなと思いました。(今書きながら、post_updated
だと元の記事を変更してしまうので、この方法は使えないなと思いました。別の手段で実装することになると思います。)
しかし、post_updated
リファレンス
https://codex.wordpress.org/Plugin_API/Action_Reference/post_updated
では3つの変数を取るはずなのに、以下のようにしてみると、1つしか変数をとっていないように見えます。
php
1add_filter('post_updated', function($id, $post_after, $post_before){ 2 wp_die(var_export($id, true) . '/' . var_export($post_after, true) . '/' . var_export($post_before, true)); 3});
実行結果
Fatal error: Uncaught ArgumentCountError: Too few arguments to function {closure}(), 1 passed in /Users/[user_name]/[project_name]/wp-includes/class-wp-hook.php on line 288 and exactly 3 //以下、スタックトレースが続く
上はPHP7.2.10でのエラーなのですが、当初PHP5.6.37でやっていて、そのときは以下のようなエラーが出ます。
Warning: Missing argument 2 for {closure}() in /Users/[user_name]/[project_name]/wp-content/themes/[theme_name]/inc/functions/branch.php on line 149 Warning: Missing argument 3 for {closure}() in /Users/[user_name]/[project_name]/wp-content/themes/[theme_name]/inc/functions/branch.php on line 149 Notice: Undefined variable: post_after in /Users/[user_name]/[project_name]/wp-content/themes/[theme_name]/inc/functions/branch.php on line 150 Notice: Undefined variable: post_before in /Users/[user_name]/[project_name]/wp-content/themes/[theme_name]/inc/functions/branch.php on line 150 201/NULL/NULL
inc/functions/branch.php
はfunctions.php
からrequire_once
されているファイルで、ブランチ関係のものが入っています。また、201はコピー元のpost_id
です。
ちなみに以下だとErrorやWarningが出ません。
php
1add_filter('post_updated', function($id){ 2 wp_die(var_export($id, true)); 3});
試したこと
これはいろいろカスタマイズがされたWordPressで試したのですが、その後、インストールしたばかりでプラグインなども有効にしていないもので試しても同じでした(WP_DEBUGなどの指定が不完全だったのか、最後の201/NULL/NULL
に相当するところしか出ませんで
したが。また、Wordpress5の新しいエディタだと更新はajaxで行うようなので、表には出てこなかったのでchromeのコンソールで確認しました)。
また、post_updated
以外にも、例えばuser_has_cap
でもリファレンスでは3引数取るはずなのに
https://codex.wordpress.org/Plugin_API/Filter_Reference/user_has_cap
1引数しか取得できず、rest_{$this->post_type}_query
でもリファレンスでは2引数取るはずなのに
https://developer.wordpress.org/reference/hooks/rest_this-post_type_query/
1引数しか取得できませんでした。
wp-includes
ではどうなっているのだろうと調べたのですが、wp-includes/default-filters.php
では
php
1add_action( 'post_updated', 'wp_save_post_revision', 10, 1 );
とwp-save_post_revision
を読んでいて、これはwp-includes/revision.php
にありますが、
php
1function wp_save_post_revision( $post_id ) { 2 //... 3}
となっているので仕様のようです。
ただ、googleでwordpress アクションフック 引数 足りない
とかで調べても情報が出てこないので、もしかしたら私の環境だけ変になっているのではないかという考えも捨てきれていません。(単に調べ方が悪いだけだとは思いますが)
補足情報(FW/ツールのバージョンなど)
MAMP 5.2(351)
PHP7.2.10
MySQL5.7.23
Apache2.2.34
macOS Mojave 10.14.2
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/15 23:07