質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

2758閲覧

wordpressのプラグイン作成で save_post を使うと、新規投稿で実行されてしまいます。

roy13al

総合スコア10

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/11/14 13:39

WordPress 4.8.3, PHP 7.0.18, MySQL5.7

上記の環境で、ワードプレスのプラグイン開発を始めたのですが、アクションフックの save_post の仕組みでハマってしまいました。

php

1function testes_saving( $post_id ) { 2 if ( wp_is_post_revision( $post_id ) ){ 3 return; 4 } 5 6 die( '保存しました。' ); 7} 8add_action( 'save_post', 'testes_saving' );

このような形でプラグインを作成した所、管理画面の新規投稿画面(/wp-admin/post-new.php)にアクセスしただけで、”保存しました。”と表示されてしまいます。(新規投稿画面は表示されていません。)

要望としては、新規投稿画面が表示され、内容を入力後に「公開」ボタンを押すことで、 testes_saving が実行されるような動きにしたいです。

Wordpress には、他にプラグインを導入しておらず、インストールしてから何も触っていない状態です。

色々検索していると、 edit_post を使用するといいということを発見しました。
多くのサイトでは、 save_postが紹介されているのですが、最新バージョンでの仕様が変わったのでしょうか?

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

私も同じ内容で悩んでいました。
そこで、下記のようなコードで色々試してみました。

php

1add_action('save_post_event', function($postId){ 2 echo($postId); 3 exit(); 4}

新規追加画面を開いた時には呼ばれますが、既存の記事の編集画面を開いた時には呼ばれませんでした。
また、新規追加画面を開いた時点で$postidに数値が格納されていました。

以上のことから推測するに、新規追加画面を開いた時点で一時的に保存されるためにsave_postが呼ばれているのではないかと思います。


要望としては、新規投稿画面が表示され、内容を入力後に「公開」ボタンを押すことで、 testes_saving が実行されるような動きにしたいです。

私は kei344 様の方法を知らなかったのですが、どうやら本家のリファレンスでもそのような記述があるので、これを使うのが良さそうです。

○Plugin API/Action Reference/save post « WordPress Codex
https://codex.wordpress.org/Plugin_API/Action_Reference/save_post

また、保存時全てではなく公開時などで良いのであれば、save_postではなくpublish_postを利用する手もあると思います。


色々検索していると、 edit_post を使用するといいということを発見しました。
多くのサイトでは、 save_postが紹介されているのですが、最新バージョンでの仕様が変わったのでしょうか?

こちらについても検証しましたが、save_postは保存時必ず呼ばれますが、edit_postは「新規保存」時には呼ばれず、すでに保存されている投稿を編集した際に呼ばれるようです。
なので、

新規投稿画面が表示され、内容を入力後に「公開」ボタンを押すことで、 testes_saving が実行されるような動き

には使用できないと思われます。


P.S. 検証不足で誤りがあったらすみません。。

投稿2018/02/06 15:35

編集2018/02/10 18:34
yuicho

総合スコア142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、save_post のような影響が出やすい部分はそう変更されません。もし変更があったとしても、同じフック名を別の箇所で使いまわすことは考えにくいです。下記部分が最新のコードですが、変わっていません。

【post.php in tags/4.8.3/src/wp-includes – WordPress Trac】
https://core.trac.wordpress.org/browser/tags/4.8.3/src/wp-includes/post.php#L3510


ページを表示してすぐ実行されるということは、まず下記部分を確認してみてください。
0. testes_savingが他でフィルタ/フックに登録されている
0. 記述ミスで関数が思った挙動と違う動作になっている(デバッグモードになっていない)


あと、新規作成のみに限定するなら引数も拾ったほうが良いでしょう。

PHP

1add_action( 'save_post', 'my_save_post', 10, 3 ); 2function my_save_post( $post_id, $post, $update ) { 3 if ( $update ) return; // 更新時を除外 4 // 処理 5}

【WordPress 特定の固定ページを保存時に処理を実行したい。 - かもメモ】
http://chaika.hatenablog.com/entry/2016/06/20/083000

【WP関数『wp_insert_post』に含まれるアクションフック5つ | sand a lot Web & Music Create [札幌]】
https://www.sandalot.com/wp関数『wp_insert_post』に含まれるアクションフック5つ/

投稿2017/11/14 14:16

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問