WordPressでオリジナルのデータベース(テーブル)を作成する [プラグイン開発中級編] wpdb オリジナルデータテーブル データ取得

http://www.webopixel.net/wordpress/637.html

カスタム投稿(カスタムフィールド)のデフォルト構造
—-
[meta_id] – [post_id] – [meta_key] – [meta-value]
1(increment)    1         item_name     book1
2               1         price         2800
3               2         item_name     book2
4               2         price         4800

—-

上記をプラグインを有効にしたときに、新たにテーブルを作り直す。
—-
[meta_id] – [post_id] – [item_name] – [price]
1(increment)    1         book1         2800
2               2         book2         4800
—-

[wp-content] – [plugins] – [custom-meta-table] –
custom-meta-table.php
—-
/*
Plugin Name: Custom Meta Table
Plugin URI: http://www.example.com/plugin
Description: カスタムフィールドの値をオリジナルのテーブル(DB)に保存する。
Author: Myname
Version: 0.1
Author URI: http://www.example.com/
*/


class CustomMetaTable {
    // Table name
    var $table_name;
    // DB version
    var $cmt_db_version = '1.0';

    public function __construct() {
        global $wpdb;

        // Add table's prefix
        $this->table_name = $wpdb->prefix . "ex_meta";
        // Execute when activate
        // プラグインを有効化したとき実行。
        // オプション: 実行する関数のファイル名(このファイル),
        //           実行する関数(ここではこのクラスの'cmt_activate'関数)
        register_activation_hook( __FILE__, array($this, 'cmt_activate') );
        // Destroy the table when deactivate
        // If you want to leave the meta data, please comment out.
        register_deactivation_hook( __FILE__, array($this, 'cmt_deactivate') );

        // Add action of input field
        add_action( 'add_meta_boxes', array($this, 'ex_metabox') );
        // Add action of save post
        add_action( 'save_post', array($this, 'save_meta') );
        // Add action of delete post
        add_action( 'delete_post', array($this, 'delete_meta') );
    }

    // Create the table in DB
    public function cmt_activate() {
        global $wpdb;
        $charset_collate = $wpdb->get_charset_collate();
        // Check DB version
        $installed_ver = get_option( 'cmt_meta_version' );
        if ( $installed_ver != $this->cmt_db_version ) {
            $sql = "CREATE TABLE {$this->table_name} (
                meta_id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
                post_id bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
                item_name text,
                price int(11),
                UNIQUE KEY meta_id (meta_id)
                ) {$charset_collate};";
            require_once(ABSPATH . "wp-admin/includes/upgrade.php");

            // Use dbDelta to fit for alteration of db.
            // 「dbDelta」を使用していますが、これはデータベースの差分を比較して必要に応じてテーブルを追加・修正をしてくれます。
            dbDelta($sql);
            // Save db version in wp_options
            update_option( 'cmt_meta_version', $this->cmt_db_version );
        }
    }

    // Destroy the table in DB
    public function cmt_deactivate() {
        global $wpdb;
        $installed_ver = get_option( 'cmt_meta_version' );
        if ( !empty($installed_ver) ) {
            $wpdb->query( "DROP TABLE {$this->table_name};" );
            delete_option( 'cmt_meta_version' );
        }
    }

    // Create the custom field
    public function ex_metabox( $post ) {
        add_meta_box(
            'exmeta_sectionid', // Unique id of html in editting display.
            'その他の項目', // Title in editting display.
            array($this, 'ex_meta_html'), // callback function to show edit.
            'post' // section to edit.
            // 編集画面セクションのどのタイプに表示するか。
            // 'post','page','dashboard','link','attachment',
            // 'custom_post_type'(slug),'comment')
            // 複数 array('post', 'page') で指定できるらしい。未確認。
            );
    }

    // Show editting style
    public function ex_meta_html() {
        // Set nonce
        wp_nonce_field( plugin_basename(__FILE__), $this->table_name );
        global $post;
        global $wpdb;

        $get_meta = $wpdb->get_results(
            $wpdb->prepare( "SELECT * FROM " . $this->table_name . " WHERE post_id = %d", $post->ID )
            );

        $get_meta = isset( $get_meta[0] ) ? $get_meta[0] : null;
        $item_name = isset( $get_meta->item_name ) ? $get_meta->item_name : null;
        $price = isset( $get_meta->price ) ? $get_meta->price : null;
        ?>

        <div>
            <table>
                <tr>
                    <th>商品名</th>
                    <td><input name="item_name" value="<?php echo $item_name; ?>" /></td>
                </tr>
                <tr>
                    <th>価格</th>
                    <td><input name="price" value="<?php echo $price; ?>" ?></td>
                </tr>
            </table>
        </div>

    <?php
    }

    // Save record
    public function save_meta( $post_id ) {
        // Check if our nonce is set.
        if ( !isset($_POST[$this->table_name]) ) return;
        // Verify that the nonce is valid.
        if ( !wp_verify_nonce($_POST[$this->table_name], plugin_basename(__FILE__)) ) return;

        // If this is an autosave, our form has not been submitted,
        // so we don't want to do anything.
        if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return;

        // Check the user's permissions.
        if ( !current_user_can('edit_post', $post_id) ) return;

        global $wpdb;
        global $post;

        // リビジョンを残さない。
        if ( $post->ID != $post_id ) return;

        $temp_item_name = isset( $_POST[‘item_name’] ) ? $_POST[‘item_name’] : null;
        $temp_price = isset( $_POST[‘price’] ) ? $_POST[‘price’] : null;

        // create an array for save
        $set_arr = array(
            'item_name' => $temp_item_name,
            'price' => $temp_price,
            );

        $get_id = $wpdb->get_var(
            $wpdb->prepare("SELECT post_id FROM " . $this->table_name . " WHERE post_id = %d", $post_id)
            );
        // If there isn't the post record, insert new post, otherwise update the post.
        if ( $get_id ) {
            $wpdb->update( $this->table_name, $set_arr, array('post_id' => $post_id) );
        } else {
            $set_arr[‘post_id’] = $post_id;
            $wpdb->insert( $this->table_name, $set_arr );
        }
        $wpdb->show_errors();
    }

    // Delete the post record
    public function delete_meta( $post_id ) {
        global $wpdb;
        $wpdb->query( $wpdb->prepare("DELETE FROM {$this->table_name} WHERE post_id = %d", $post_id) );
    }

    // Functiin for show meta_data in template file
    /* Using:
      * <?php
      *   if ( have_post() ) : while ( have_post() ) : the_post();
      *     the_content();
      *     $get_meta = $exmeta->get_meta($post->ID);
      *     $item_name = isset($get_meta->item_name) ?
      *         $get_meta->item_name : null;
      *     $price = isset($get_meta->price) ?
      *         $get_meta->price : null;
      *     echo esc_html($item_name);
      *     echo esc_html($price);
      *   endwhile; else :
      *     echo "There is not a post";
      *   endif;
      * ?>
    */
    public function get_meta( $post_id ) {
        if ( !is_numeric($post_id) ) return;
        global $wpdb;

        $get_meta = $wpdb->get_results(
            $wpdb->prepare( "SELECT * FROM {$this->table_name} WHERE post_id = %d", $post_id )
            );
        return isset( $get_meta[0] ) ? $get_meta[0] : null;
    }
}
$exmeta = new CustomMetaTable;

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です