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

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

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

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

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

514閲覧

[WordPress] 「記事の保存が始まる前」にカスタムフィールドから値を取得し、その値を元にAPIをコールする方法

spellbound

総合スコア190

WordPress

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

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/07/10 01:59

編集2017/07/11 03:56

#追記(現在のコード)

php

1#functions.php 2add_action( "add_post_meta", 'callApiBeforePosting', acmId, {$newAcmId} );

#分からないこと

  • functions.phpに記載することは間違っていないのか?
  • add_action('save_post', 'call_api_before_posting');は書き方として間違っていないのか?
  • add_actionの下部にcall_api_before_posting関数を定義すれば良いのか。

#可能であれば、聞きたいこと

  • 既存のテーブルに既にAPIをコールして必要な値が保存されている場合、スキップし、そうでない場合はAPIをコールするという仕組みはどのようにして書けば良いのか。

#なぜ開発するのか
全記事のカスタムフィールドに保存されているIDを取得して、そのIDを元にAPIをコールするバッチ処理を別途開発済みです。そのバッチ処理は1日に1回動く仕組みです。しかし、記事が投稿されて、その記事のカスタムフィールドに新しいIDが含まれていた場合、バッチ処理されるまでAPIがコールされていない状態です。そこで、バッチ処理がされるのを待つのではなく、記事投稿時に個別でAPIをコールする機能が必要だったので、開発しています。

#既存のコード

// 記事投稿前に既存のテーブルをチェックし、既にAPIをコールした値が保存されていたらスキップ。そうでない場合はAPIをコールする add_action('save_post', 'call_api_before_posting'); function call_api_before_posting() { //カスタムフィールドからacmIdを取得 getAcmIds($wpdb); // accommodationsテーブルに当該施設は存在するか調べる $newAcmIds = $wpdb->get_results( " IF NOT EXISTS( SELECT acm_id FROM $wpdb->accommodations ) " ) }

コードは途中です。

#追記

php

1do_action('save_post', 'callApiBeforePosting'); 2function callApiBeforePosting() { 3 include_once('wp-content/themes/travelify/display-name-and-location.php'); 4}

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

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

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

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

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

kei344

2017/07/10 02:45

「投稿される前」とは「記事の保存が始まる前」「記事IDが生成された後」「カスタムフィールドの保存時」「完了時」どの時点のことでしょうか。またそうしたい理由もあわせて追記いただけませんか?
spellbound

2017/07/10 03:21

ご質問ありがとうございます。「投稿される前」は、「記事の保存が始まる前」です。
kei344

2017/07/10 03:22

そうしたい理由もあわせて追記いただけませんか?
spellbound

2017/07/10 03:35

全記事のカスタムフィールドに保存されているIDを取得して、そのIDを元にAPIをコールするバッチ処理を別途開発済みです。そのバッチ処理は1日に1回動く仕組みです。しかし、記事が投稿されて、その記事のカスタムフィールドに新しいIDが含まれていた場合、バッチ処理されるまでAPIがコールされていない状態です。そこで、バッチ処理がされるのを待つのではなく、記事投稿時に個別でAPIをコールする機能が必要だったので、開発しています。
kei344

2017/07/10 03:55

この「質問への追記・修正の依頼」の部分はデフォルトで表示されませんので、質問本文を編集することをお勧めします。
spellbound

2017/07/10 03:56

ご助言ありがとうございます.
guest

回答1

0

ベストアンサー

下記アクションがカスタムフィールド(の特定のキー)新規登録時にのみ発行されます。それをフックすれば処理を追加することが可能です。

【add_metadata() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/add_metadata/

PHP

1do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value );

https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/meta.php#L94

投稿2017/07/10 04:05

kei344

総合スコア69398

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

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

spellbound

2017/07/10 06:08

ちなみに、上記の`do_action`をfunctions.phpに記載し、上記の`do_action`の上で処理を書けば良いのでしょうか。
kei344

2017/07/10 06:11

> `do_action`をfunctions.phpに記載し 違います。フックの使い方は書籍を読むか検索するかすれば出てくると思います。 引用した箇所はフックに渡る引数の種類と内容がわかりやすいので提示しました。
spellbound

2017/07/10 07:48

フックの使い方や意味は分かりましたが、既存のコードではダメということでしょうか。
spellbound

2017/07/10 07:53

記事の保存が始まる前にその記事のカスタムフィールドの値を取得して、その値を元にAPIを叩く機能を実装したいというゴールに対して上記のコードで実現可能なのでしょうか...
kei344

2017/07/10 08:31

> 記事の保存が始まる前にその記事のカスタムフィールドの値を取得して、その値を元にAPIを叩く機能を実装したいというゴールに対して上記のコードで実現可能なのでしょうか 記事の保存は下記手順を通ります。 1.記事の登録(IDが生成される) 2.そのIDを利用してカスタムフィールドなどmeta情報を保存する 現在提示されている要件で上記「記事の登録」より前で実行することに特に大きな意味は無い(上記1,2はほぼ同時に実行されるため)ので、「2.」のmetaの新規保存時にフックしたらどうか、と提案しています。 > 既存のコードではダメということでしょうか。 save_postフックは保存時に毎回通りますが、そこでフックするよりも1回だけ通るmetaの新規保存時にフックするほうが手間がないと思いますよ。
spellbound

2017/07/10 08:46

kei344さんのおっしゃる通りですね。カスタムフィールドに追加する際、APIをコールする処理を呼び出すということですね。実装してみます!
spellbound

2017/07/10 08:53

ただし、わからない点があります。 APIをコールして処理する関数はどのようにして呼び出せば良いのでしょうか。 `do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value );`では書く場所がないかと思います。
kei344

2017/07/10 09:03

「書く場所がない」とは?
spellbound

2017/07/10 10:10

APIをコールするための関数を指定する場所が、`do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value );`から見当たらないということです。
spellbound

2017/07/10 12:12

何度も質問してすみません。 前述した内容だと開発できそうにないので、難易度を下げました。 追記したようなコードで実装しようとしています。 これだと、PHPファイルが実行されないんですが、原因は分かったりしますか...?
kei344

2017/07/10 12:33

追記されたコードを見るに、こちらの提示したURLを読んでいないのでしょう、残念です。 1日1回のバッチを1日24回とかに増やしたほうが早いのでは。
spellbound

2017/07/11 01:11

>1日1回のバッチを1日24回とかに増やしたほうが早いのでは。 これだと問題が生じてしまいます。kei344さんがご提示して下さったURLを深く読みたいと思います。すみません...。
spellbound

2017/07/11 01:41

ご提示して下さったページを何度も読んでいますが、自分の実現させたいこととマッチしていない気がします。
spellbound

2017/07/11 01:46

1. カスタムフィールドにIDを追加する前にフックする 2. その追加しようとしたIDをクエリーストリングとして扱い、某APIをコールする 3. JSONデータをパースして文字列のデータを取得 4. そのデータを任意のテーブルにインサートする 5. 文字列をタグとして扱うためのテーブルにインサートする 6. 処理が完了したらカスタムフィールドが完全に保存された状態にする
spellbound

2017/07/11 01:47

これがやりたいことです。ご提示して下さったURLの内容だと、メタデータを追加する構文かと思います。
spellbound

2017/07/11 13:54

申し訳ありませんでした...。
kei344

2017/07/11 16:03

> 申し訳ありませんでした...。 何についてでしょう。
spellbound

2017/07/12 01:00

ご提示して下さった記事がヒントになり、解決できたからです。 もっと深く読むべきでした...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問