LoginSignup
11
16

More than 5 years have passed since last update.

(中断...)WordPressによる顧客管理システム2016

Last updated at Posted at 2016-10-16

HTMLもPHPもWordPressもロクにわかってないローカルアプリ屋が顧客管理システムに奮闘する。
冗長な表現があると思うけど、逆に言うとわかってない人もそれなりに追えると思う。

参考ページ

ホームページだけじゃない!管理システムとしてのWordPress ←これいろいろ古いなぁ...

クライアントが抱える問題点及び要望

・Facebook等でややアナログに通販のオーダーを受けてから、クロネコB2Web を使って「送り状」を発行し、管理。一時期に200件超の入力が集中発生した結果、未発送トラブルに見舞われた模様。
というのも、クロネコB2は「伝票発行したものの実は送ってない」という「カラ伝票」の状態というのがあって、ログを見てみたらそのカラ伝票がたくさんあった...。シチュエーションとしては伝票だけ先に用意したけど送ろうとした日に、送付オペレーションが限界に来たりして "その日は送らなかった" という「小さなカラ伝票ゴミ」がつもりつもって混乱を引き起こしたのだと思われる。

・こっちが全部手当するんじゃなくて、Webページで顧客自身が、「去年どこにいくつ送ったっけ?」というのを思い出しながらオーダーさせ、こっちはCSVにまとめてオーダーを出力してクロネコB2のアップローダーを使って送り状を発行させるところまでやりたい。

おおまかな仕様

・顧客が自分で送付先住所などを入力して注文する
・顧客が自分で注文済み明細を照会出来る
・旅館側がクロネコのドライバーに商品を渡したときにエビデンス(写真)を撮り、画像をアップロードする
・旅館側はエビデンスの登録されていない未発送リストに対する「クロネコB2フォーマットのCSV」を出力することができる
・顧客も旅館のスタッフも出先などでも確認出来る
・請求書を発行できる
・未払いフラグをつけて、未払い者に対して督促メールを送ることができる

行動開始

WordPress自体の「テーマ」はなんでもいいんじゃないかなぁ。どうせ改造するし...ってことで

子テーマの作成

WordPressテーマのカスタマイズで子テーマを使うべき理由、使い方など
「テーマ」は自動的にアップデートされて、ほどこしたカスタマイズはなかったことにされるようだ。子テーマは、カスタマイズ部分だけを書けばいいので、むしろ管理しやすくなる模様。
1.子テーマのフォルダを作る
2.子テーマに必要なファイルを作る
3.親テーマを継承するためのコードを書く

ターミナル1(VPS接続用):コマンドメモ
(WordPressを入れた場所)$ cd ../../var/www/html/wp-content/themes
(フォルダを作成)$ mkdir twentyfifteen-child
(フォルダを作成した場所)$ cd ./twentyfifteen-child
(Viで開く)$ vi functions.php #ファイルがなければ新規作成してくれる
(Viで開く)$ vi style.css

伝票発行画面のレイアウトを変更

投稿画面から不要な機能を削除する
WordPress 管理画面の「WordPress のご利用ありがとうございます。」を非表示にする
WordPressに「Yahoo・天気予報ブログパーツ」を設定する
WordPressの functions.phpがある場所
また 黒い画面 か しょうがねぇなぁー

ターミナル1(VPS接続用):コマンドメモ
(いまどこ?)$ pwd
(WordPressを入れた場所)$ cd ../../var/www/html/wp-content/themes/twentyfifteen
(ここになにがありますか?)$ ls -l
(root権限にチェンジ)$ sudo -s
(Viで開く)$ vi functions.php

functions.php

"子テーマの" functions.phpです。いまはこれでソース全量です。

ターミナル1(VPS接続用):コマンドメモ
<?php

/**
 * 親テーマのCSSも読んで下さい
 */
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
}

/**
 * 投稿画面から不要な機能を削除します。
 */
function remove_post_supports() {
    remove_post_type_support( 'post', 'editor' ); // 本文欄
}
add_action( 'init', 'remove_post_supports' );

/**
 * 「WordPress のご利用ありがとうございます。」を非表示にする
 */
add_filter('admin_footer_text', 'custom_admin_footer');

「本文欄」と管理画面のフッターの「WordPress のご利用ありがとうございます。」が消えた!
image

伝票一覧画面のレイアウトを変更

index.php

このショットはまだ未加工。でもソースを見た限りでは、「content.php」ってファイルに依存して記事の子種をリスト表示するようだ。
image

つまりこういうこと(ここまでくるにも時間かかったな...でもだいぶphpの世界観に慣れてきた)
image

content.php

では、子種を見ていこう。
image

この「if is_single()」の分岐は、子種を一覧表示しているときと、一覧のなかのうちのひとつをクリックして個別投稿を表示しているときの分岐らしい。つまり「個別投稿=is_single()」のルートのところにテキトーに「あ」と打ち込んでみると
image

1.個別投稿の画面に「あ」が出てきて
2.記事一覧には「あ」が出ない。
つまり「is_single()」はそういう判断命令らしい
image

こうした

ターミナル1(VPS接続用):コマンドメモ
<?php
/**
 * The default template for displaying content
 *
 * Used for both single and index/archive/search.
 *
 * @package WordPress
 * @subpackage Twenty_Fifteen
 * @since Twenty Fifteen 1.0
 **/
?>

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <?php
                // Post thumbnail.
                twentyfifteen_post_thumbnail();
        ?>

        <header class="entry-header">
                <?php
                        if ( is_single() ) :
                                the_title( '<h1 class="entry-title">', '</h1>' );
                        else :
                                the_title( sprintf( '<a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a>' );
                                edit_post_link( __( 'Edit', 'twentyfifteen' ), '<span class="edit-link">', '</span>' );
                        endif;
                ?>
        </header>

        <?php
                // Author bio.(記事作成ユーザーのプロフィール)
                if ( is_single() && get_the_author_meta( 'description' ) ) :
                        get_template_part( 'author-bio' );
                endif;
        ?>

</article><!-- #post-## -->

こうなった。なんか子種のワクがデケェェェーなー...!CSSかな...
image

CSSを編集する

style.css

"子テーマの" style.cssです。いまはこれでソース全量です。

ターミナル1(VPS接続用):コマンドメモ
/*
 Theme Name:   Twenty Fifteen Child
 Template:     twentyfifteen
*/

/**
 * 3.0 Typography
 */
body,
button,
input,
select,
textarea {
    font-family: "Meiryo", serif;
}

/**
 * 12.0 Content
 */
.site-footer {
    padding: 1% 7.6923%;
}

/**
 * 12.1 Posts and pages
 */
.hentry {
    padding-top: 2%;
    padding-bottom: 1%;
}
.entry-content,
.entry-summary {
    padding: 0 7.6923% 1%;
}

/**
 * 15.0 Media Queries
 */
@media screen and (min-width: 38.75em)
.hentry + .hentry, .page-header + .hentry, .page-header + .page-content {
    margin-top: 1%;
}

/**
 * 15.1 Mobile Large 620px
 */
@media screen and (min-width: 38.75em) {

    .entry-summary {
        padding: 0 9.0909% 1%;
    }

    .site-footer {
        padding: 1% 7.6923%;
    }

    .site-main {
            padding: 1% 0;
    }

    .hentry + .hentry, .page-header + .hentry, .page-header + 
    .page-content {
            margin-top: 1%;
    }
}

/**
 * 15.4 Desktop Small 955px
 */
@media screen and (min-width: 59.6875em) {

    .site-main {
        padding: 1% 0;
    }

    .hentry {
        padding-top: 1%;
    }

    .page-header + .page-content {
        margin-top: 1%;
    }

        .site-footer {
                padding: 1% 7.6923%;
        }
}

記事一覧のフッターを変更

フッター「proudly powered by wordpress」を消す方法
ワードプレスのフッターをCopyright(C)に表示する方法
フローティングメニューをフッターに表示する

image

footer.php

image

ターミナル1(VPS接続用):コマンドメモ
<?php
/**
 * The template for displaying the footer
 *
 * Contains the closing of the "site-content" div and all content after.
 *
 * @package WordPress
 * @subpackage Twenty_Fifteen
 * @since Twenty Fifteen 1.0
 */
?>

    </div><!-- .site-content -->

    <footer id="colophon" class="site-footer" role="contentinfo">
        <div class="site-info" >
            <!-- クレジットの表記-->
            <a href="http://www.hidamaristyle.com/" target="_blank"><img src="http://xxx.xx.xx.xxx/wp-content/uploads/2016/10/3713f88b0d5bcfff013eb51b8832c609.png" >
        </div><!-- .site-info -->
    </footer><!-- .site-footer -->

</div><!-- .site -->

<?php wp_footer(); ?>

</body>
</html>

ということでこうなった
image

伝票一覧画面(子種一覧)にACFカスタムフィールドの値を表示する

Advanced Custom Fieldsの出力

content.phpのこれかな?
image

おう!出たじゃん!むしろ管理画面の投稿一覧に出すよりラクだな!
image

じゃあ、「is_single()〜」のあたりをこんな感じでHTMLのテーブル組にしてーの、、
image

content.php

ターミナル1(VPS接続用):コマンドメモ
<?php
/**
 * The default template for displaying content
 *
 * Used for both single and index/archive/search.
 *
 * @package WordPress
 * @subpackage Twenty_Fifteen
 * @since Twenty Fifteen 1.0
 */
?>

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
        <?php
                // Post thumbnail.
                twentyfifteen_post_thumbnail();
        ?>

        <header class="entry-header">

                <?php
                if ( is_single() ) :
                        the_title( '<h1 class="entry-title">', '</h1>' ); ?>
                        <table>
                        <thead><tr>
                                <th>出荷予定日</th>
                                <th>お届け先名</th></tr>
                        </thead>
                        <tbody><tr>
                                <td><?php the_field("003_SEND_YMD", $post_id); ?></td>
                                <td><?php the_field("012_DESTINATION_NAME", $post_id); ?></td></tr>
                        </tbody>
                        </table>

                <?php else: ?>
                        <table>
                        <thead><tr>
                                <th>伝票名</th>
                                <th>出荷予定日</th>
                                <th>お届け先名</th></tr>
                        </thead>
                        <tbody><tr>
                                <td><?php the_title( sprintf( '<a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a>' ); ?></td>
                                <td><?php the_field("003_SEND_YMD", $post_id); ?></td>
                                <td><?php the_field("012_DESTINATION_NAME", $post_id); ?></td></tr>
                        </tbody>
                        </table>
                <?php endif; ?>

        </header><!-- .entry-header -->

        </div><!-- .entry-content -->

        <?php
                // Author bio.
                if ( is_single() && get_the_author_meta( 'description' ) ) :
                        get_template_part( 'author-bio' );
                endif;
        ?>

</article><!-- #post-## -->

style.css

"子テーマの" style.cssに追記

ターミナル1(VPS接続用):コマンドメモ
/**
 * 4.0 Elements
 */
table {
        margin: 0;
        border-width: 0;
}
th,td {
        border-width: 0;
}

一度上空から観察

いいじゃん!あとは好きな項目があるかないかだからね。好きなだけ増減させればいい。

子種一覧

image

個別投稿

image

伝票検索機能

WordPressプラグイン『Search Everything』サイト内検索の範囲を選択する

これで、カスタムフィールドが検索できるようになりました。
image

画像用のカスタムフィールドを追加

画像用のカスタムフィールドを作ってみたけど「画像を追加する」が機能しない。どうやら権限が原因のようだ?(調査中)

image

ユーザー管理機能

1.お客さんがログインして伝票を発行し、自分の発行した明細だけを見る
2.管理者がログインして全発行明細を見る
そういったユーザーの使い分け(管理)はダッシュボード(管理画面)へのログイン機能を使ってログインさせた直後に(ダッシュボードの画面にいかずに)ホームのページへ飛ばすことでおこなう。
普段から編集するときログインしまくってるでしょ?それの応用。
たしかにURLにアクセスするたんびにログイン求められて、これじゃなんか不自然じゃない??ってちょっと思ってた、、。

ログイン画面のロゴを変更する

ログイン画面カスタマイズに便利なプラグイン「Custom Login Page Customizer」

顧客用ログイン時の管理画面をセットアップする

あぁ、このページはいいね
WordPress管理画面を顧客用にカスタマイズする方法

WordPressバージョンの更新情報を非表示にする

フッターのWordPressリンクを非表示にする

管理バー(上部)の「表示オプション」と「ヘルプ」を非表示にする

ターミナル1(VPS接続用):コマンドメモ
// 「表示オプション」と「ヘルプ」を非表示にする
function my_admin_head(){
if (!current_user_can('level_10')) {
echo '<style type="text/css">#contextual-help-link-wrap,#screen-options-link-wrap{display:none;}</style>';
}
}
add_action('admin_head', 'my_admin_head');

管理バー(上部)にログアウトを追加する

ダッシュボード左側のメニューを非表示にする

ターミナル1(VPS接続用):コマンドメモ
// メニューを非表示にする
function remove_menus () { 
 if (!current_user_can('level_10')) { //level10以下のユーザーの場合メニューをunsetする
 remove_menu_page('wpcf7'); //Contact Form 7
 global $menu;
 unset($menu[5]); // 投稿
 unset($menu[25]); // コメント
 unset($menu[75]); // ツール
 unset($menu[80]); // 設定
 }
 }
add_action('admin_menu', 'remove_menus');

WordPressで記事の公開ボタンを押したら確認ダイアログを出す

ターミナル1(VPS接続用):コマンドメモ

投稿画面の「プレビュー」ボタンを非表示にする

ターミナル1(VPS接続用):コマンドメモ
//プレビューボタンと下書きとして保存ボタンの非表示(Chrome検証ツールで探したものもある)
//プレビューボタンと下書きとして保存ボタンの非表示
add_action('admin_print_styles', 'admin_preview_css_custom');
function admin_preview_css_custom() {
   echo '<style>#save-action {display: none;}</style>';
   echo '<style>#preview-action {display: none;}</style>';
   echo '<style>#misc-publishing-actions {display: none;}</style>';
   echo '<style>#formatdiv {display: none;}</style>';
   echo '<style>#categorydiv {display: none;}</style>';
   echo '<style>#tagsdiv-post_tag {display: none;}</style>';
   echo '<style>#collapse-menu {display: none;}</style>';
   echo '<style>#se-metabox {display: none;}</style>';
}

AdvancedCustomFieldsでユーザープロフィールの項目を新たに追加する方法

2つめの写真の下のシカクが重要。AdvancedCustomFieldsプラグインで新規追加して、項目(電話番号とか)を作って、
「位置」-「ルール」のところの3条件を、「ユーザー」「等しい」「全て」にセットすると、ユーザープロフィールの項目が新規追加のときと編集のときに追加される。
く・・・っ!「user-new.php」いじっちゃったりすごく遠回りしたなぁ・・・経験値は得てるからいいけど・・・ 
image

image

管理バーの項目を削除する

ターミナル1(VPS接続用):コマンドメモ
/**
 * 管理バーの項目を削除します。
 */
function remove_bar_menus( $wp_admin_bar ) {
    $wp_admin_bar->remove_menu( 'wp-logo' );      // ロゴ
    $wp_admin_bar->remove_menu( 'my-account' );   // マイアカウント
    $wp_admin_bar->remove_menu( 'comments' );     // コメント
}
add_action('admin_bar_menu', 'remove_bar_menus');

「あなたのプロフィール」管理画面の項目を非表示にする方法

ログイン時に権限ごとに違うページに遷移させる

ターミナル1(VPS接続用):コマンドメモ
// 管理者かそうでないか、で十分
add_action('wp_login', 'redirect_page', 10, 2);
function redirect_page($user_login, $user)
{
    $user_role = $user->roles[0];
    if( $user_role != 'administrator' ){
        //管理者じゃなければ「陽だまり試験場」のホームのページに行く
        wp_redirect( home_url() );
        exit();
    }
}

プラグイン「UserRoleEditor」をインストールする

・権限は「管理者」と「寄稿者」しか使わない。「寄稿者」は「新規投稿」ができるだけ、の状態にした。

ユーザープロフィールのデフォルト項目を非表示

ユーザープロフィールのデフォルト項目を非表示にするのがムズい!:sob:
意外に難しい? WordPressの「あなたのプロフィール」管理画面の項目を非表示にする方法
このページに、
・「ユーザー」-「あなたのプロフィール」画面の設定項目については、上remove_meta_box関数やプラグインが使えません。
・ユーザー管理画面には「表示オプション」タブすらない
・ユーザー管理画面はそうではなく、フォーム部品がHTMLでほぼ直書き

などと書かれている...
僕もしばらく調べ回ってみたけどどうやらHTML直修正が早そう(このページの人は js でやってる)

user-new.php

もうここまできたらディープカスタマイズの世界だね
このディレクトリまで行って、「user-new.php」を開いてください(雑...
テーマディレクトリより上の階層です
image

ターミナル1(VPS接続用):コマンドメモ
# pwd
# ls -l
# vi ../../../wp-admin/user-new.php
# cd ../../var/www/html/wp-admin
# vi user-new.php

image

first_nameとか消したいような名前がついているところをコメントアウト
image

その少し下のHTMLにも、なんだか「ラベル」と「テキストボックス」のセットになってるっぽいので、
image

Chromeでみてもそういうセットになってるので3セット(姓・名・ウェブサイト)をコメントアウトする。
image

コメントアウトしました。
image

消えたぜ!:muscle::poop:
image

user-edit.php

この調子で既存プロフィールの変更(=あなたのプロフィール)のほうもいくぞ

ターミナル1(VPS接続用):コマンドメモ
# pwd
# ls -l
# vi ../../../wp-admin/user-edit.php
# cd ../../var/www/html/wp-admin
# vi user-edit.php

chromeで、このへんは「form-table」という名前であることがわかったのでおまえらいらねー!ってことで
image

image

消えたー!なんか見方がわかってきてちょっと気持ちよくなってきた。
image

同じ要領で繰り返してこうなった

表示をログインユーザーに限定

"子テーマの" functions.phpに追記

functions.php

ターミナル1(VPS接続用):コマンドメモ
/*-------------------------------------------*/
/*  表示をログインユーザーに限定する
/*-------------------------------------------*/
function require_login() {
    if ( ! is_user_logged_in() && ! preg_match( '/^(wp-login\.php|async-upload\.php)/', basename( $_SERVER['REQUEST_URI'] ) ) && ! ( defined( 'DOING_AJAX' ) && DOING_AJAX )  && ! ( defined( 'DOING_CRON' ) && DOING_CRON ) ) {
        auth_redirect();
    }
}
add_action('init', 'require_login') ;

伝票一覧画面(子種一覧)に表示される件数を絞る

(「最近の投稿」はあとで削除予定かなぁ、絞り方わからないし、、、)
image

1.ユーザーIDを取得
2.WP_Queryでログイン者だけに投稿を絞るクエリーを作成し「query」に格納
3.while〜のところの2ヶ所に「query->」と追記

index.php

"子テーマの" index.phpに追記

ターミナル1(VPS接続用):コマンドメモ
<?php

// 「あなたの投稿したものだけ」表示するクエリを発行 WP_QUERY
$user = wp_get_current_user();
$userID = $user->ID;
$query = new WP_Query( 'author='.$userID );

if ( have_posts() ) : ?>
        <?php
        // Start the loop.
        while ( $query->have_posts() ):$query->the_post();

「再度購入」を実装

image
Amazonみたいな機能は必要だよね。
同じ住所に対して同じ個数を送るとか、個数だけいじれて再注文とか。便利よね。ここでSQLの発行が必要になる。
SQLの発行が必要なタイミングは2つ。
1.再度購入をしたいときの「INSERT」
2.差分発行の「UPDATE+INSERT」

1に関しては、単純にパラメータを同じにしたINSERTの発行をすればよい。
2に関しては、例えば注文数8なのにその日のオペレーションがオーバーして7こしか送れなかったときに '注文数' を7に更新して、さらに '注文数' が1の「再度注文」をするとよい。

WordpressPHPで打つMySQL基本

MySQL:memo
#db名:wordpress
#選択したいテーブル名:wp_users

#mysql起動
mysql -u root -p

#wordpressというデータベースのなかには何のテーブルがあるんだっけ?
SHOW TABLES FROM wordpress;

#データベース選択
USE wordpress;

#テーブルの構造を見る
SHOW COLUMNS FROM wp_posts;

#SQL発行
SELECT * FROM wp_users;

single.php

ITかあさん:WordPressでQueryをゴリゴリ操作 wpdbまとめ
Codex関数リファレンス / wpdb Class
WordPressでシステム開発をする時に必要なクエリ操作について

UPDATE

投稿id(post_id) '243' の注文数(ORDERCOUNT)を '8' に変える。

PHP:UPDATE
<?php
global $wpdb;
$wpdb->update('wp_postmeta', array('meta_value'=>'8'), array('post_id'=>'243', 'meta_key'=>'ORDERCOUNT'), '%d', array('%d','%s'));
?>

wordpressのAdvancedCustomFieldで追加した項目の値はMySQLの「wp_postmeta」に入るが、このテーブルの列項目は4つである(ムズカシク言うと正規化が進んでいて独自の項目がいくらでも追加できる仕様になっている)
image

何が言いたいかというと、post_idが '243' の meta_keyが 'ORDERCOUNT' というところまで指定して、その値は8という理解をする必要がある。
image

つまり、投稿id(post_id) '243' の注文数(ORDERCOUNT)を '8' に変える(UPDATE)構文は、以下のようになる。

PHP:UPDATE(整理)
<?php

#dbいじりの前にかならず必要
global $wpdb;

$wpdb->update(

  #更新対象のテーブル
  'wp_postmeta', 

  #更新する値
  array('meta_value'=>'8'), 

  #WHERE 
  array('post_id'=>'243', 'meta_key'=>'ORDERCOUNT'), 

  #更新する値のデータフォーマット(数値です)
  '%d', 

  #WHEREのデータフォーマット(最初が数値、つぎが文字での指定です)
  array('%d','%s')); 

?>

ようやく整理できた!
なお、第2引数(更新する値)は必ず array 形式の書き方になる。
なんとか array を少なくしようとして試行錯誤したけど「更新する値」のところは連想配列にせざるを得ないようだ。
列と値をペアにする書き方をする以上、その調子だと第3引数の WHERE も、条件が1つだとしても array 形式になるな。
だから array をハズすことができたのは、今回は第3引数のみだった。

なお、「=>」はダブルアロー演算子と言って、連想配列のときに使う。ダブルアローを知らないまま array をどうにかハズそうと試行錯誤して沼にはまっていた...。

INSERT

さて、更新は目的の値を見つけることができればいいけど新規明細発行(INSERT)の場合は、必ず入れなければいけないいくつかの値があるはずだ。当ツールは、1つの伝票を1つの投稿と位置づけて投稿の中身はほぼカスタムフィールドだけで作成されている。
つまり、WordPressの テーブル構造(下図) を見る限りでは「wp_posts」で投稿そのものを作り、「wp_postmeta」でカスタムフィールドの値をつくれば良いことになる。
image

wp_postsの構造

んー・・・FieldとDefault(初期値)を見比べて、初期値になっちゃいけないのを抜き出すか、、、。
post_author:投稿者のユーザID
post_date:投稿日時(日本時間)
post_date_gmt:投稿日時(協定世界時)

image

気になって調べた項目
post_excerpt:excerpt=抜粋
post_status:'publish': 公開済み
comment_status:'open': 許可 243のpostを見る限りは closed

SQL:INSERT
INSERT INTO wp_posts (post_author, post_date, post_date_gmt, comment_status ) VALUES (1, NOW(), utc_timestamp(), 'closed');

すでに投稿してある「実際のデータ」と「初期値」と「SQLを発行して増えたデータ」を比べてみた。
...まぁいいんじゃねぇかなぁ。
image

wp_postmetaの構造

meta_id は auto_increment のためいじらず。
post_idとmeta_keyとmeta_valueは、まぁ一般データ的に見ても必要だよね。
image

SQL:INSERT
#WordPressで必須項目にしちゃったやつや、初期値が入る設定にしちゃったやつ、入ってないと不自然なやつは全部
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'PRODUCT_NAME', 'プルーン');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'ORDERCOUNT', '10');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'USE', 'ギフト');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'DESTINATION_POSTAL', '3310052');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'DESTINATION_ADDRESS', 'BAMWEST101');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'DESTINATION_NAME', 'yoshitaka');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'DESTINATION_KEISYO', '様');
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (243, 'DESTINATION_TEL', '9093036833');

そういえばさっきからダブってるこれなによ?
これな(赤線から上が正規画面からの投稿、赤線から下がSQL直)
image

ここ(ACFプラグインを使う際の注意点など) を見てみると...要は
1.先頭にアンダーバーを付けたデータがあって、これはACFのフィールドキーである。
2.フィールドキーがないと、ACFのget_field関数で正しくデータを読めない。
3.管理画面から一度でも保存すればACFのフィールドキーは生成できるが、それ以外の方法(フィールドキーを参照するAPI等)は見つかっていない。
4.get_field関数が使えないと集計ができない。

ということらしい。
あぁ、、、振り返るとだいぶディープダンジョンな感じになってきたな(笑

つまりだ・・・新規投稿をSQLで行うときは
1.(SQL)最新POSTのフィールドキーを求める(必須項目のみでいいね)
2.(PHP)アンダーバーを先頭につけた meta_key でもって、フィールドキーを meta_value に突っ込む
という工程が必要になる。
必須項目ではないところは、ユーザーの更新時にまかせる。

公式の英語の質問ページ にもなくて数時間悩んだ挙句、
あれ?:thinking:
1.欲しいフィールドキー名を配列で引数に取り込んで
2.IN句でアンダースコアを先頭につけながらDISTINCTで取得
すればいいんじゃないの?という結論

SQL:SELECT
SELECT DISTINCT meta_key, meta_value FROM wp_postmeta WHERE meta_key IN (
'_PRODUCT_NAME',
'_ORDERCOUNT',
'_USE',
'_DESTINATION_POSTAL',
'_DESTINATION_ADDRESS',
'_DESTINATION_NAME',
'_DESTINATION_KEISYO',
'_DESTINATION_TEL',
'_DESTINATION_TIMEZONE');

いいじゃん。どや!外人!:grin:(外人ってゆーな!)
image

PHPメモ(カンマで配列にスプリット)
<?php
$fruit = explode(',', 'りんご,みかん,いちご,メロン,バナナ');
foreach($fruit as $value){
    // SQLを生成して
    echo $value . <br>;
}
?>

HTML基礎(ボタンを押したあとデータはどこへ行くのか?)

フォームデータを送信する

例えばこういうソースを single.php に書き込むと

HTML基礎
<form action="/" method="get">
  <input name="say" value="Hi">
  <input name="to" value="Mom">
  <button>Send my greetings</button>
</form>

1.'say' 変数に 'Hi' という値が入ったテキストボックス
2.'to' 変数に 'Mom' という値が入ったテキストボックス
3.'Send my greetings' と書かれた送信ボタン
が出てきた!
ボタンを押してみると...
image

アドレスバーに変数名と値が出てきた!そういうことか!
image

登録フォームを作成(ボタンを押したらSQL発行)

WordPressで登録フォームを作成(ここのソースを読んで最適化した)

single.php

single.php
<?php
/**
 * The template for displaying all single posts and attachments
 *
 * @package WordPress
 * @subpackage Twenty_Fifteen
 * @since Twenty Fifteen 1.0
 */

get_header(); ?>


        <div id="primary" class="content-area">
                <main id="main" class="site-main" role="main">

                <?php
                // Start the loop.
                while ( have_posts() ) : the_post();
                        get_template_part( 'content', get_post_format() );
                // End the loop.
                endwhile;
                ?>

                <?php
                // POSTリクエストの場合(下の方で再度購入ボタンが押されて再起した(page_stateに1が入った)ときに通る)
                if( isset($_POST['page_state']) && $_POST['page_state'] == '1' )
                {
                        $orderCount = $_POST['ReOrderCount'];

                        // 投稿を作成
                        SQLInsert_posts();

                        // 新規投稿のIDを取得
                        $postid = GetLatestPostId();

                        // 商品名
                        $col = 'PRODUCT_NAME';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // 注文数
                        $col = 'ORDERCOUNT';
                        SQLInsert_postmeta($postid, $col, $orderCount);

                        // 用途
                        $col = 'USE';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // お届け先郵便番号
                        $col = 'DESTINATION_POSTAL';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // お届先住所
                        $col = 'DESTINATION_ADDRESS';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // お届け先名
                        $col = 'DESTINATION_NAME';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // お届け先敬称
                        $col = 'DESTINATION_KEISYO';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // お届け先電話番号
                        $col = 'DESTINATION_TEL';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // お届け時間帯
                        $col = 'DESTINATION_TIME';
                        SQLInsert_postmeta($postid, $col, get_field($col));

                        // ステータス
                        $col = 'STATUS';
                        SQLInsert_postmeta($postid, $col, '未着手');

                        $message = '再注文しました。';
                        ?>
                        <div class="hentry entry-header"><p><strong><?php echo $message ?></strong></p></div>

                        <!-- 記事一覧へ戻るボタン -->
                        <form class="hentry entry-header" method="post" action="/">
                                <button>ホームへもどる</button>
                        </form>

                <?php
                }else{
                ?>

                        <?php
                        // %7Eはチルダ。チルダ'~'をナミ線'〜'に置換せよ
                        $crrURL = str_replace('%7E', '~', $_SERVER['REQUEST_URI']);
                        ?>
                        <!-- 再度購入ボタン -->
                        <form class="hentry entry-header" method="post" action="<?php echo $crrURL ?>">
                                <P>同じ商品を同じお届け先に再注文できます。再注文数を入力してください。</P>
                                <input type="hidden" name="page_state" value="1">
                                <input type="number" name="ReOrderCount" style="width:100px; text-align:right;" value="1">
                                <button>再度購入</button>
                        </form>

                <?php
                }
                ?>

                </main>
        </div><!-- .content-area -->

★WordPressPHP TIPS

「真/偽」チェックボックスは、get_field()すると「1」か「無」が返る。ややこしい!
ヘルパーファンクション(falseかtrueを返すだけの関数)作る手もあるんだけど、、根雪みたいなもんだからこっちに慣れるか、、、)
Advanced Custom Fieldsによるカスタムフィールドの出力 [チェックボックス・ラジオボタン編]

WordPressPHP-TIPS
if( get_field('field_name') ) //真の場合
{
    echo '真の場合の処理';
}
else // 偽の場合
{
    echo '偽の場合の処理';
}

★ネット回線がぶちぶち切れながら作業してたときにハマったCSSエラー

僕ね、WiMAXのモバイルで接続しながらやってるんだけど、これ結構接続おちるのね...。
なぜか突然CSSが死んだ時期があって functions.php の名前を変えてカラの functions.php を作ったりしながらようやく復旧した。
image
(この画面もう見たくない...)

なぜかこの行が消えていた。。。恐ろしい。。。functions.php もだんだん積み上がってきたところでこういうの起こるとまじでわからん。固定回線でやりてーぇ・・・
image

functions.php
<?php

// 親テーマのCSSも読んで下さいね、という命令
function theme_enqueue_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
}
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );

処置の結論から言うと
・CSSデザインが崩れたならやっぱりCSSのところに原因がある。
・子テーマに必要なファイルは style.css と functions.php。最低限の構成でトライ。
・動いていた時期のソースはおさえとけ(GitHub覚えねぇとなぁ、、、)
よけいなとこで時間食ったなぁ、、、。みなさんも回線に注意ね。っていうかこのクソ重SSHも原因なんじゃないか?

カテゴリーをつけたい

・wp_term_taxonomy

カテゴリーのテーブルのようだ
image

・wp_term_relationships

記事とカテゴリーを紐付けているようだ
image

MySQLに金額のテーブルをつくる

商品名と金額の情報を持つテーブル

CREATETABLE
CREATE TABLE IF NOT EXISTS M_PRODUCT (
  ID    INT UNSIGNED AUTO_INCREMENT NOT NULL,
  name  VARCHAR(100) NOT NULL DEFAULT '',
  price INT UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (ID)
);

image

image

INSERT
INSERT INTO M_PRODUCT (name, price) VALUE ('プルーン','2000');
INSERT INTO M_PRODUCT (name, price) VALUE ('生ワイン','3000');
SELECT
SELECT * FROM M_PRODUCT;

image

改造固定ページについて

ちょっとまだメカニズムの整理追いついてないけど「できたので」まとめる(笑

1.固定ページ新規作成

image

新規固定ページを作ってタイトルつけて、中身の編集なしで公開しちゃう。
今回は page_id=81 が付与された。
image

ページを公開する際に、スラッグを命名する(公開したあとでもいいけど)。
image

2.テンプレートのコピー

親テーマで「page.php」と書いてあるものが固定ページのテンプレなので
子テーマフォルダにコピーしてきて「page-csv.php」という名前に変える。
これがリンケージになる。

ターミナル1(VPS接続用):コマンドメモ
[twentyfifteen-child] cp ../twentyfifteen/page.php page-csv.php

image
あとは 「page-csv.php」 のHTMLにPHPループ仕込んで帳票ページにするのもいいし、固定ページを独自体裁にすることができる。

3.ページへのリンクを貼る

そうしたら子テーマ(このページを見てる人はindex.phpは子テーマにあるはず)の 「index.php」 にこんなふうにボタンでのリンクでもくっつけて、

image

ターミナル1(VPS接続用):コマンドメモ
<input class="hentry" type="submit" value="請求書" onClick="location.href='/?page_id=2'">
<input class="hentry" type="submit" value="CSV出力" onClick="location.href='/?page_id=81'">

できあがったボタンを押すと
image

ホラ変わった!
image

4.クエリで未着手を取り出す

WordPress覚書 その1 「カスタム投稿の取得とか出力とか」

LOOP
<?php
// 「未請求」だけを表示してCSV出力
$query = new WP_Query();
$param = array(
    'post_type' => 'post',
    'category_name' => 'shop',
    'meta_query' => array(
        array(
            'key' => 'STATUS',
            'value' => '未着手'
        )
    )
);
$query->query($param);
?>

<table class="invoice">
<thead><tr>
    <th>商品名</th>
</thead>
<tbody>
<?php
if( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
?>
    <tr>
    <td><?php the_field('PRODUCT_NAME'); ?></td>
    </tr>
<?php 
endwhile; 
endif; 
?>
<?php wp_reset_postdata(); ?>
</tbody>
</table>
11
16
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
11
16