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

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

http://blog.yukarien.com/tech/wordpress-db-access/


##手順の概要
####1.テーブル作成
####2.wp-db.phpを編集
####3.追加テーブルのデータ取得

##まえがき

作るテーブルとデータはこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/c183a79d-f842-db25-8896-db92d16714d5.png)

##テーブル作成
DB:_wp104

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/1f3ee4d1-b810-b770-0561-d16cfb6a91db.png)


###挿入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/6cf0cf73-6a86-8707-a8fd-0d31015e6948.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/e2e4c3ed-9b0b-c755-7851-6ed3c0f83a53.png)


###表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/a2b22d68-31ca-293b-0343-d90258db4466.png)


##wp-db.phpを編集

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/14be74ba-6b8b-77ed-9486-11753f4c7a3b.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/b5525377-9060-4279-09e8-f2b6381f68d0.png)


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

```.php
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://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/d9ed4f9f-38df-2825-4562-b31ae4301977.png)

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

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

データベースに追加したproductsテーブルを参照するためには、ショートコードを利用します。
ショートコードは、fucntions.phpの最後に以下のように記載します
####注意点
echoを使って出力するのですが、そのまま利用すると思った位置に表示してくれません。それを回避するために、ob_start();とreturn ob_get_clean();の間にechoを持ってきて出力位置を安定させます。

[参考記事](https://tanidaiz.com/wordpress%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%A1%A8%E7%A4%BA%E4%BD%8D%E7%BD%AE%E3%81%8C%E4%B8%8A%E3%81%AB%E6%9D%A5%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86/)

```.php
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');
```

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

```.html
[sc_test]

```

https://yuuchika.com/shortcode_method/


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

###csvはutf8(CR+LF)で保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/8174ddb8-5e53-58c6-bd0e-ea445a719b9e.png)


###照合順序を「utf8_general_ci」に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/d2790ed6-c6a5-b7a0-cdae-016eaa340167.png)

### テーブルの構造はコピーできる
phpmyadminの操作タブから可能！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/3ccb2928-d982-1c88-e09c-ecb2df315181.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/73013ce4-66e7-3b46-f50f-2a64bdb8171d.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/afc67bc2-715b-d7f9-1fc5-df773d75d721.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/3926cde4-6b30-f71e-e7be-e466e2f2f98b.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]
```