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

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

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

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

Q&A

解決済

2回答

272閲覧

Wordpressのfuctions.phpでupdate_post_metaを動かしたい

igarashi1020

総合スコア2

WordPress

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

0グッド

0クリップ

投稿2024/03/28 16:01

実現したいこと

お世話になります。
下記のようにしてカスタム投稿で更新した時だけ、カスタムフィールドを書き換えたいのですが、うまく動いていないようです。

発生している問題・分からないこと

そもそも$post->IDが取れてなさそうなのですが、どこかが間違っているのかわからず。
ご教示いただければ幸いです。

該当のソースコード

php

1 add_action( 'publish_to_publish', function( $post ) { 2 $post_type = $post->post_type; 3 $post_id = $post->ID; 4 update_post_meta( $post_id, 'data', $post_type ); 5 } );

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

検証のため、いろいろそぎ落としてここまで内容減らしましたが、やはり動かないのでそもそも書き方が間違っているのかと思いましたが、'publish_to_publish'の場合は、$postの値が想定したものと違うものが入っているのでしょうか。

補足

特になし

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

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

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

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

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

hiroki-o

2024/03/29 00:59

実際に動かしたわけではなく、机上調査ですが、 https://developer.wordpress.org/reference/functions/wp_transition_post_status/ を読む限り、publish_to_publishはサポートされていないと思います。 do_action( "{$old_status}_to_{$new_status}", $post );に対応しているのは、「draft_to_publish」「publish_to_trash」「pending_to_draft」のようです。 (読み間違いでしたら、ごめんなさい)
guest

回答2

0

自己解決

そもそもフックの仕様なのかと思い、下記のサイトを参考にして作り直したら上書きされずに保存できました。
https://qiita.com/_nakashimamura/items/7e0a6de2ad913239ef4e

投稿2024/04/03 04:44

igarashi1020

総合スコア2

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

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

0

FreeBSD 13.2、PHP 8.3.1、WordPress 6.4.3で確認しました。

コメント欄にpublish_to_publishは対応していないと書きましたが、実際に動かしてみると、対応していました。
$post->IDも正常に取れています。

add_action( 'publish_to_publish', function( $post ) { $post_type = $post->post_type; $post_id = $post->ID; // 以下、変更 if ($post_type == 'カスタム投稿のpost_type') { update_post_meta($post_id, 'カスタムフィールドの名前', 'カスタムフィールドの値'); } } );

投稿2024/03/30 05:54

hiroki-o

総合スコア1358

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

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

igarashi1020

2024/03/30 17:23 編集

何度か試してもダメで以下のようにして検証してみました。 全く関係ない記事を更新すると正常に動作しました。 どうも動作自体はしているものの、そのあとに書き換えた後に該当のカスタムフィールドの値上書きされているのではないかと思います。 add_action( 'publish_to_publish', function( $post ) { $post_type = $post->post_type; update_post_meta('2434165', 'data', $post_type); } ); なので順番の問題なのだろうと思い、下記のようにしたのですが、今度は更新時に「更新に失敗しました。」と出てしまい動きませんでした;;save_postを使えとか言われそうですが、こっちも別の不具合が出るのでまた別の質問にします。 function test( $new_status, $old_status, $post ){ $post_type = $post->post_type; $post_id = $post->ID; update_post_meta('2434165', 'htmlarea', $new_status); } add_action('publish_to_publish','test',10,3);
hiroki-o

2024/03/30 19:41

後者は検証していませんが、前者についていうと、通常の投稿/カスタム投稿のいずれでも更新時に呼ばれます。 通常の投稿の場合、$post->post_typeは「post」です。なので、私が提示したソースのように場合分けしないと上書きされます。
igarashi1020

2024/04/02 08:32

回答ありがとうございます。試してみましたが解決できませんでした。 場分けというのは、if ($post_type == 'カスタム投稿のpost_type') {の部分だと思ういますが、 入れてみても上書きされてしまうようです。 私の環境だけですかね。。。
hiroki-o

2024/04/02 22:26

デバッグ出力してみて、更新のタイミングで$postに意図した値が入っているかを確認してください。 (ご存じかもしれませんが、念のため↓) wp-config.phpを変更 define( 'WP_DEBUG', false ); ↓ define('WP_DEBUG', true); define('WP_DEBUG_DISPLAY', false); define('WP_DEBUG_LOG', true); update_post_meta呼び出し前 error_log($post_type); error_log($post_id); wp-content/debug.logに出力されます。
igarashi1020

2024/04/03 03:49

回答ありがとうございます。試してみましたが解決できませんでした。 2回ずつ同じ値が入ってました。 下記のページを拝見したところsave_postも2回実行されるようなので同じ仕様なのかと思います。 https://zenn.dev/vanshi/scraps/01d101551ac07c そもそもフックの仕様なのかと思い、下記のサイトを参考にして作り直したら上書きされずに保存できました。 https://qiita.com/_nakashimamura/items/7e0a6de2ad913239ef4e
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問