質問するログイン新規登録

Q&A

0回答

104閲覧

WordPressで構築したサイトの製品情報をAPIを使用して別サイトに表示させる方法

matsu766

総合スコア1

WordPress

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

PHP

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

API

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

0グッド

0クリップ

投稿2025/12/23 05:55

0

0

実現したいこと

WordPressで構築したカタログサイトの製品情報を、別サイトにあるメーカーだけに絞り込んだ状態でAPIを使用して表示させたい。

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

AIを使用しながらコードを記述しているが、うまくAPIで表示させることができない。

該当のソースコード

// API設計 add_action('rest_api_init', function () { register_rest_route('custom/v1', '/products', [ 'methods' => 'GET', 'callback' => 'get_products_by_manufacturer', 'permission_callback' => '__return_true', ]); }); // API本体 function get_products_by_manufacturer(WP_REST_Request $request) { $manufacturer = $request->get_param('manufacturer'); $limit = $request->get_param('limit'); if ($limit === null || $limit === '') { $limit = -1; } else { $limit = intval($limit); } if (empty($manufacturer)) { return new WP_Error( 'no_manufacturer', 'manufacturer parameter is required', ['status' => 400] ); } // REST API 経由のクエリが既存ロジックに影響されないように add_filter('pre_get_posts', function ($q) { if (defined('REST_REQUEST') && REST_REQUEST) { $q->set('suppress_filters', true); } }); $args = [ 'post_type' => 'product', 'posts_per_page' => $limit, 'post_status' => 'publish', 'meta_query' => [ [ 'key' => 'manufacturer', 'value' => $manufacturer, 'compare' => 'like', ] ], 'meta_key' => 'pick', 'orderby' => [ 'pick' => 'DESC', 'date' => 'DESC', ], ]; $query = new WP_Query($args); $products = []; if ($query->have_posts()) { foreach ($query->posts as $post) { // --- ACF --- $acf_fields = get_fields($post->ID) ?: []; // --- タクソノミー --- $taxonomies = ['industry', 'product_type', 'purpose']; $tax_data = []; foreach ($taxonomies as $tax) { $terms = get_the_terms($post->ID, $tax); if (!is_wp_error($terms) && !empty($terms)) { $tax_data[$tax] = array_map(function ($term) { return [ 'id' => $term->term_id, 'name' => $term->name, 'slug' => $term->slug, ]; }, $terms); } else { $tax_data[$tax] = []; } } $products[] = [ 'id' => $post->ID, 'permalink' => get_permalink($post->ID), 'date' => $post->post_date, 'acf' => $acf_fields, 'taxonomy' => $tax_data, ]; } } wp_reset_postdata(); return [ 'count' => count($products), 'data' => $products, ]; }
/** * 既存サイトから製品一覧を取得(キャッシュ付き) */ function fetch_products_from_api($args = []) { // ===== 設定 ===== $api_base = 'http://20251223.local/wp-json/custom/v1/products'; $default_args = [ 'manufacturer' => 'アマダ', 'per_page' => -1, // ← APIが理解する名前に変更 ]; $params = wp_parse_args($args, $default_args); $cache_key = 'products_api_' . md5(serialize($params)); // ===== キャッシュ(10分)===== $cached = get_transient($cache_key); if ($cached !== false) { return $cached; } // ===== API URL ===== $url = add_query_arg($params, $api_base); $response = wp_remote_get($url, [ 'timeout' => 10, ]); if (is_wp_error($response)) { return []; } $json = json_decode(wp_remote_retrieve_body($response), true); // 👇 data で包まれていない前提 if (empty($json) || !is_array($json)) { return []; } // ===== キャッシュ保存 ===== set_transient($cache_key, $json, 10 * MINUTE_IN_SECONDS); return $json; } function get_display_products($args = []) { $products = fetch_products_from_api($args); $results = []; foreach ($products as $item) { $acf = $item['acf'] ?? []; $tax = $item['taxonomy'] ?? []; $results[] = [ 'id' => $item['id'], 'date' => $item['date'] ?? '', // --- ACF --- 'product_name' => $acf['product_name'] ?? '', 'model_number' => $acf['model_number'] ?? '', 'product_image' => $acf['product_image'] ?? '', 'catalog_num' => $acf['catalog-num'] ?? '', 'maker_url' => $acf['maker-url'] ?? '', 'catalog_page' => $acf['catalog-page-url'] ?? '', 'seller' => $acf['seller'] ?? '', 'pick' => (int)($acf['pick'] ?? 0), // --- taxonomy --- 'industry' => $tax['industry'] ?? [], 'product_type' => $tax['product_type'] ?? [], 'purpose' => $tax['purpose'] ?? [], ]; } return $results; }

試したこと・調べたこと

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

製品情報以外は思った通り表示されているが、製品情報は70件近くあるものが1件しか取得できず、それも正しく表示はされていない。
元サイトのjsonを確認すると製品情報は正しく入っていそうな感じでした。

補足

特になし

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

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

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

yambejp

2025/12/23 08:26

状況がよくわからないのですが、APIを作ってデータを共有したい・・・ではなくAPIからデータを取得して表示させたいということでよろしいですか? jsonデータが確実に取得できているのであればあとはjsonデータをHTMLに適用するだけだと思いますが・・・jsonデータが不十分もしくはエラーになっているようであればAPI側の仕様の可能性がたくなるのでAPIのマニュアルを確認するか運営に問い合わせるかでしょう。(APIの不備については質問板できかれてもブラックボックスであれば回答はできませんので)
meg_

2025/12/23 09:03

> 製品情報は70件近くあるものが 上記は「WordPressで構築したサイト」に製品が70件登録されている、という意味でしょうか? > 元サイトのjsonを確認すると 「元サイト」とは「WordPressで構築したサイト」のことでしょうか? 要するにJSONデータを上手く扱えないということが課題なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問