9
17

More than 3 years have passed since last update.

WordPressで自作テーブルを作成してデータを利用する方法

Last updated at Posted at 2019-10-15

WordPressに自作テーブルにデータをぶち込んで利用したいと思ったので、検索してみたらやり方が載っていたので、実際にやってみました。

手順の概要

1.テーブル作成

2.wp-db.phpを編集

3.追加テーブルのデータ取得

まえがき

作るテーブルとデータはこんな感じです
image.png

テーブル作成

DB:_wp104

操作

テーブル名は他のテーブルを真似て頭にwpbkを付けます。

image.png

挿入

image.png

image.png

表示

image.png

wp-db.phpを編集

wp-db.phpはwp-includesフォルダ内にあります

image.png

Wordpressがバージョンアップされると、wp-db.phpは書き換わるので要注意!!!

image.png

テーブル名が定義してある箇所がありますので、そこに追加するテーブル名[products]を記載します

var $tables = array( 'posts', 'comments', 'links', 'options', 'postmeta',
        'terms', 'term_taxonomy', 'term_relationships', 'termmeta', 'commentmeta','products' );

db.php を使って対応する方法

db.phpを作るとwp-db.phpが書き換わってもちゃんと接続できるようになっています。

wp-content>db.php

image.png

[参考]https://yululy.com/wpdb_database_include/

追加テーブルのデータ取得

データベースに追加したproductsテーブルを参照するためには、ショートコードを利用します。
ショートコードは、fucntions.phpの最後に以下のように記載します

注意点

echoを使って出力するのですが、そのまま利用すると思った位置に表示してくれません。それを回避するために、ob_start();とreturn ob_get_clean();の間にechoを持ってきて出力位置を安定させます。

参考記事

ob_start();
    foreach($get_data as $data) {
        echo '<p>[' .$data->name . ']</p>';
    }
return ob_get_clean();

実際のコード

functions.php
function shortcode_test(){
global $wpdb;   
$get_data = $wpdb->get_results("SELECT * FROM $wpdb->products ");
ob_start();
    foreach($get_data as $data) {
        echo '<p>[' .$data->name . ']</p>';
    }
return ob_get_clean();
}
add_shortcode('sc_test', 'shortcode_test');

投稿記事の好きな場所から呼び出します

[sc_test]

CSVファイルをインポートする

csvはutf8(CR+LF)で保存

image.png

照合順序を「utf8_general_ci」に変更する

image.png

テーブルの構造はコピーできる

phpmyadminの操作タブから可能!

image.png

Ninja Tablesプラグインを使ったテーブル設計

image.png

独自でテーブルを作成していましたが、状況によってはNinja Tableプラグインを使うと楽な場合があります。

ninja_table_items というテーブル名でデータベースに保存されています。

image.png

ninja_tableで作成したテーブルのフィールドや値はすれべvalueという項目内に配列のようにして格納されています。

image.png

 【参考】ninja tableからデータを取出してみた

hoge.php
function get_nintbl($atts){
    //------ninjaテーブルを使った値の呼び出し方-------------
    //プレフィックスを設定してください
    //記事の中からショートコードで呼び出す
    //ショートコード[nintbl table番号 条件項目 条件項目の値 取得フィールド]
    //例えば、tabel番号が92でid=1のレコードのprice項目の値を取得する場合 [nintbl 92 id 1 price]
    //注1 複数レコードが該当するような条件は利用できない
    //注2 部分検索を利用している似たような項目名を付けない(price_max,price_min)

    global $wpdb;

    //プレフィックス(データベースのテーブル名の頭の文字列)を設定する
    $prefix="wpyd"; 

    //$prepared_sql = $wpdb->prepare("SELECT *FROM $wpdb->ninja_table_items WHERE table_id = %d",$atts[0]);
    $prepare_sql = $wpdb->prepare("SELECT * FROM ".$prefix."_ninja_table_items WHERE table_id = %d",$atts[0]);  
    $results=$wpdb->get_results($prepare_sql);

    //echo count($results);

    $replace = [
        // '置換前の文字' => '置換後の文字',
        '[' => '',
        '{' => '',
        '}' => '',
        ']' => '',
        '"' => '',
      ];

    //var_dump($results);

    foreach($results as $data) {
        //[{"id":"1","career":"docomo","ols":"ドコモオンライン","price":"10000"}]

        // カンマ区切りのデータを分割
        $str_data=str_replace(array_keys($replace), array_values($replace), $data->value);
        $arry_data = explode(",", $str_data);

        //var_dump($arry_data);
        $match = preg_grep('!'.$atts[1].':'.$atts[2].'!',$arry_data);

        if(count($match)>0){
            $value = preg_grep('!'.$atts[3].'!',$arry_data);
            foreach($value as $val){
                   return str_replace($atts[3].":","",$val); 
            };
        }        
    }
}
add_shortcode('nintbl','get_nintbl');

記事からショートで呼び出す

hoge.php
[nintbl 92 id 1 price]
9
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
17