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

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

ただいまの
回答率

90.51%

  • WordPress

    8940questions

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

カスタムテーブルへのデータ保存

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,006

tuckQ

score 55

前提・実現したいこと

WordPressのコメント機能をカスタマイズして独自テーブル「wp_review_meta」にデータ保存したい

具体的には、

  1. コメントの基本情報は「wp_comments」テーブルに保存しつつ、追加情報を「wp_review_meta」に保存
  2. 上記2つのテーブルの情報をcomment_IDで紐付けて表示

のようなイメージ。

試したこと

プラグインを作成。
プラグイン有効時に独自のデータベースを作成するところまではうまくできた。

テーブル構成は下記です。
※「comment_id」は後でwp_commentsテーブルの「comment_ID」に関連づけるために用意
※主キーは「review_id 」でauto incrementを指定している
+------+--------------------------------+-----+-----+
| review_id | comment_id | data1 | data2 |
+------+--------------------------------+-----+-----+
|1|1|てすとでーた|テストデータ|
+------+--------------------------------+-----+-----+

コメント投稿時にアクションフックでオリジナル関数を呼び出し、データベースに新規追加or更新するコードを記述。(下記参照)

該当のソースコード

add_action( 'comment_post', 'save_review_data' );
function save_review_data( $comment_id ) {
  global $wpdb;

  //「data1」「data2」は、コメント投稿欄のカスタムフィールドから取得と仮定
  $temp_data1 = isset($_POST['data1']) ? $_POST['data1'] : null;
  $temp_data2 = isset($_POST['data2']) ? $_POST['data2'] : null;

    $get_id = $wpdb->get_var(
                $wpdb->prepare( "SELECT comment_id FROM
                    wp_review_meta WHERE 
                    comment_id = %d", $comment_id)
    );

    //保存するために配列にする
    $set_arr = array(
        'review_id' => '',
        'data1' => $temp_data1,
        'data2' => $temp_data2,
        );

        //レコードがなかったら新規追加あったら更新
    if ($get_id) {
        $wpdb->update( $table_name, $set_arr, array('comment_id' => $comment_id));
    } else {
        $set_arr['comment_id'] = $comment_id;
        $wpdb->insert( $table_name, $set_arr);
    }
    $wpdb->show_errors();

発生している問題・エラーメッセージ

「wp_comments」へのデータ保存は通るのに、「wp_review_meta」にデータが保存されない。

補足情報(言語/FW/ツール等のバージョンなど)

ちなみに、以下のサイトを参考にしながら開発にチャレンジしています。
WordPressでオリジナルのデータベース(テーブル)を作成する [プラグイン開発中級編]

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

独自にテーブルを作らなくても、comment_meta という仕組みがありますよ。

【add_comment_meta:WordPress私的マニュアル】
http://elearn.jp/wpman/function/add_comment_meta.html

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


コードについては、フィルタアクションで実行する前に save_review_data をそのまま実行しても通るようにデバッグを繰り返すといいと思います。とりあえず、レコードの追加、更新、$_POST値の受け取り、アクションの受け取りくらいの順番だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/16 22:36

    ご回答ありがとうございます。「comment_meta」で保存する方法は事前に試してみて、成功したんですが、保存されるデータに一覧性を持たせたいと思いまして、カスタムテーブルを活用する方法を検討しております。

    デバッグ方法についてですが、なるほどフィルタアクションを使わずに、直接、関数を実行する方法だとやりやすそうですね。実践してみます!

    キャンセル

  • 2016/10/16 23:12

    「一覧性」がどういうものを指すのかがいまいちわかりませんが、wp_commentmeta もそう複雑ではないので「一覧」するのは難しくないような。

    【データベース構造 - WordPress Codex 日本語版】
    https://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0#.E3.83.86.E3.83.BC.E3.83.96.E3.83.AB.EF.BC.9A_wp_commentmeta

    とりあえず(もう設定されているかもしれませんが)開発中はデバッグモードにしておいたほうがはかどりますので、お勧めです。

    【WordPress初心者におすすめ!デバッグモードの使い方 | Mignon Style】
    http://mignonstyle.com/debug-mode/

    キャンセル

  • 2016/10/23 13:50

    回答が遅れてしまい失礼しました。「一覧性」というと語弊がありました、、分かりづらくてすみません。

    うまく文章で表現するのが難しいのですが、私の中では以下のようなイメージを持っております。

    追加するカスタムフィールドが5個あるとして、
    ■commentmetaの場合
    ・1回のコメントでmeta_idが5個追加される
    ・テーブル表示した際の「可読性」が悪い(1コメントのデータが5行)
    *「可読性」も良い表現ではないかもしれませんが。。。

    ■カスタムテーブルの場合(上記5つのフィールドを格納するフィールドを持つ)
    ・1コメントに関するデータを1レコード(行)にまとめられる
    ・テーブル表示した際の「可読性」が良い

    上記踏まえ、カスタムテーブルで作っておいた方が、のちのちデータ参照するSQL文を書く際や、データ管理の面でも楽になるのではないか?という個人的な推測による希望となります。

    追加で教えていただいたデバッグモードは既に入れておりまして、この機能のおかげで、カスタムテーブルへデータ追加を行うところまで上手くできました。(ご紹介ありがとうございます)

    カスタムテーブルの作り込みも進めておりまして、
    現在は、wp_commnetに保存されるcommentIDと同じ値を、カスタムテーブル「wp_review_meta」のcomment_idに保存する方法のところでつまづいております。
    この部分については、質問内容を更新して改めて質問させていただこうと思います。

    キャンセル

同じタグがついた質問を見る

  • WordPress

    8940questions

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