Help us understand the problem. What is going on with this article?

はじめてphpをしばいた話

More than 1 year has passed since last update.

※初心者です。

はじめまして!フリーランスでコラムライターを中心に3年ほど活動しておりますくわっち( Twitter@kuwatti_uc )と申します。
ゲームのAPIで遊ぶためにJavascriptを始めたのが2018年1月。もう9か月も経っていますね。いまだによく分かっていませんがそれなりに遊んでいます。
最近は3Dモデリング→イラスト販売とか、セールスライティングも始めたのでもうよく分からない人になっています。一体何が本職なんでしょうね。

さて、今回は「Wordpress + php + プラグインいろいろ」で、投稿本文内にphpを突き刺して遊んだ話です。
この件についてうだうだ書いたブログはこちら

やりたいこと

①プラグインを使用して、サイト利用者にフォーマット(以下、口コミフォーマット)に従って口コミを投稿してもらう
②その口コミをもとに情報を検索し、フォーマット(以下、情報フォーマット)に入力
③それぞれの内容をそれぞれのphpでレイアウトして、wordpressの投稿本文にねじ込む

使ったもの

wordpressプラグイン「WP User frontend」
知識が全くないphp
2日分の睡眠時間

…私、phpをガッツリ触ったことがなかった!
php、初体験:kiss:

wordpressプラグイン「WP user frontend」では、カスタムフィールドを用いた投稿フォームが作成できます。カスタム投稿タイプにも反応するはず。
プラグインの説明は省きますが、カスタムフィールドを自分で作って形式化できるのはよいところ。
それを投稿内にねじこむには2通りの手順が必要でした。

①投稿タイプのphpファイルを直接編集してカスタムフィールドを読み込む
②ショートコードを追加して、投稿本文内からphpファイルを呼び出す

投稿タイプのphpファイルを直接編集しちゃうと、「口コミ」と「情報」の2パターンでの書き出しができなくなるので、却下。
のちのちサイト内にphpファイルを読み込ませないもの(コラムや新しいフォーマットなど)を使いたいなと思ったときに不便が生じるので、後者のやりかたで記述しました。

1.ショートコードを追加する

[WordPress]ショートコードでPHPテンプレート(ファイル)を呼び出す | 株式会社bridgeを参考にさせていただきました。

functions.php
//ショートコードを使ったphpファイルの呼び出し方法
function my_php_Include($params = array()) {
 extract(shortcode_atts(array('file' => 'default'), $params));
 ob_start();
 include(STYLESHEETPATH . "/$file.php");
 return ob_get_clean();
}
add_shortcode('umekomi', 'my_php_Include');

正直よく分かっていません(おい)
ショートコード「umekomi」で、指定したphpを呼び出すんだな、ということは理解しています。

2.phpファイルを作る

投稿本文内に読み込ませるものなので、あんまり余計なものは書いていません。
口コミフォーマットの入力データは「single-cust.php」に、情報フォーマットの入力データは「hosp-data.php」というファイルをそれぞれショートコードで読み込ませることにしました。

まずはサイト利用者に投稿してもらった口コミのphpです。

single-cust.php
<?php $postids = get_the_ID(); ?>

<p>この口コミは<b><?php echo get_post_meta($postids , 'age' ,true); ?><?php echo get_post_meta($postids , 'dotti' ,true); ?></b>の方からの投稿です。<?php the_date( "Y年n月j日", $echo ); ?>に投稿されました。</p>
<table>
<tbody>
    <tr>
        <th>私はこんな人です</th>
        <td><?php echo get_post_meta($postids , 'who' ,true); ?></td>
    </tr>
    <tr>
        <th>私が通っている病院は…</th>
        <td><?php echo get_post_meta($postids , 'name' ,true); ?></td>
    </tr>
///中略///

<?php $service = get_post_meta( $postids , 'service' , true ); if(empty( $service ) === false){ ?>
    <tr>
            <th>こんなサービスもありました!</th>
            <td><?php echo get_post_meta($postids , 'service' ,true ); ?></td>
        </tr><?php } ?> 

            </tbody>
</table>

最初の部分では$postidsを定義して、投稿内のIDを取得しています。
そのあと、カスタムフィールドに投稿された'dotti'(性別)と'age'(だいたいの年代)を呼び出して、さらにその口コミが投稿された日時(公開された日時ではない)をthe_dateで取得。
「この口コミは20代女性からの投稿です。2018年1月1日に投稿されました。」
と表示されるようになっています。

テーブルタグに流し込みながら、ところどころの項目をifを使っています。
自由入力欄や必須項目ではないチェック項目で空欄が出るのが嫌だったので、
php $定義した何か = get_post_meta ( $postids , 'かすたむふぃーるど' , true );
  = カスタムフィールドからデータを引っこ抜いてくる
if(empty( $定義した何か ) === false){
もにょもにょ}

  =  定義したものがからっぽでなければ、以下の項目をしばく!
ということをやっています。

次は情報フォーマットのphp!

hosp-data.php
<?php $postids = get_the_ID(); ?>
<p><?php echo get_post_meta($postids , 'hospital' ,true ); ?>についての情報を掲載しています。<br>
    この記事は<?php the_time("Y年n月j日"); ?>に公開され<?php if (get_the_modified_date('Y/n/j') != get_the_time('Y/n/j')) : ?><?php the_modified_date("Y年n月j日") ?>に更新され<?php endif; ?>ています。
</p>

<h2>連絡先など</h2>
ホームページや電話番号、住所はこちらです。

<?php $mother = get_post_meta( $postids , 'mother' , true ); if(empty( $mother ) === false){ ?>
<h3>運営団体名</h3>
<p><?php echo get_post_meta($postids , 'mother' ,true ); ?></p>
<?php } ?>

<h3>病院名</h3>
<p><?php echo get_post_meta($postids , 'hospital' ,true ); ?></p>

<h3>所在地</h3>
<p><?php echo get_post_meta($postids , 'xxxxxxx' ,true ); ?><br>
 <?php echo get_post_meta($postids , 'adress2' ,true ); ?></p>
<?php
$address = post_custom('adress2');
 if (!empty($address)) {
    $address2 = urlencode($address);
    $zoom = 10;
    $url = "http://maps.google.co.jp/maps?q={$address2}&z={$zoom}";
    echo "<p><a href=\"{$url}\" target=\"_blank\">【所在地のマップはこちら(googleMaps)】</a></p>";
}
?>
//中略//
☆注意事項☆
<p style="font-size:12px;">このページの最終更新日は<b><?php echo get_the_modified_date("Y年n月j日") ?></b>です。
定期的に確認し更新するように努めていますが、間違った情報が掲載されていると感じた場合はご連絡いただけると非常に助かります。<br>

工夫したのは日付のところとマップ!
この記事は<?php the_time("Y年n月j日"); ?>に公開され
<?php if (get_the_modified_date('Y/n/j') != get_the_time('Y/n/j')) : ?>、<?php the_modified_date("Y年n月j日") ?>に更新され
<?php endif; ?>ています。

the_time(情報公開日)とthe_modified_date(最終更新日)が同じだったら
「この記事は2018年1月1日に公開されています。」と投稿されて、
the_time(情報公開日)とthe_modified_date(最終更新日)が異なる場合は
「この記事は2018年1月1日に公開され、2018年1月2日に更新されています。」
と記述されます。
「され」~「され」の間をifで書き出して、違和感少なめ、手間ナシ。とっても便利!

マップは、住所が番地まで掲載されているカスタムフィールド「adress2」を「$address」に変換させて、googlemapsを開けるように変換!倍率は抑え気味です。
投稿内に組み込むことも考えたけれど、なんかちと面倒だったので見送り。

で、最後の行には最終更新日を表示して、間違ってたら教えてね!を周知。

このファイルたちを、各種フィールドが入力された状態の投稿本文に
[umekomi file='single-cust'] or [umekomi file='hosp-data'] のどちらかを
ほいっとすれば完成!

php、便利!

初めてphpファイルをガッツリ触ったにしては上出来なんじゃなかろうか。
ショートコードを貼る手間はあるけれど、投稿された内容に一度目を通してから公開するようになっているからこれでおっけー。
出来上がったサイトはたぶんほとんどの方が無縁だろうと思われますが、よかったら見てくださいな!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away