20200319のPHPに関する記事は16件です。

Heroku MySQLのデータベースから持ってきた日本語が文字化けする

3行で

環境

PHP, Heroku, ClearDB, Mac

文字化け

HerokuとMySQLを同期するやり方は割愛。
Heroku公式のやり方でを参考にMySQLからデータを持ってくる。

<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));

$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);

$conn = new mysqli($server, $username, $password, $db);
?>

原則ここに書いてある内容はいじらなくてよい。
例えばカッコの中身をデータベース名やユーザー名に変える必要はない。
しかしこの形でデータベースから日本語のデータを持ってくると『?????』 といった形で出力されてしまう。

Heroku+ClearDBで文字化けしていた件

これでイケるかと思ったけどダメだった。

解決

$conn = new mysqli($server, $username, $password, $db);
$conn->set_charset('utf8');

文字コードを指定してあげる。これだけ。
教えていただいて解決したんですが、これを参考にするべきだったのかも。

mysqli::set_charset - PHP.net
https://www.php.net/manual/ja/mysqlinfo.concepts.charset.php

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel pluckメソッドとか便利メソッド

pluck

オブジェクト配列から同keyの値のみの配列にする

$obj配列->pluck()

Laravel Collection 参考サイト

参考:https://qiita.com/mikakane/items/76ae73990bf1ece9e7ae

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel plackメソッドとか便利メソッド

pluck

オブジェクト配列から同keyの値のみの配列にする

$obj配列->pluck()

Laravel Collection 参考サイト

参考:https://qiita.com/mikakane/items/76ae73990bf1ece9e7ae

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

さくらVPSでウェブアプリ公開まで

はじめに

ローカル環境で作ったものをサーバー上にアップロードして公開する流れをまとめます。
その中で詰まった部分などを備忘録的にまとめます。

ざっと流れ

1 さくらVPSを契約
2 Linux環境の構築
3 ドメイン取得
4 ドキュメントルート変更
5 SSL化

1さくらVPS契約

まずはさくらVPSの契約から。
さくらVPS申し込みはこちら
スクリーンショット 2020-03-19 20.49.44.png

14日間お試し期間があるのでその期間に一通りできれば無料でお勉強できます。
※プランは1Gを選択しました

登録が完了する下のようなコントロールパネルにログインできます。
スクリーンショット 2020-03-19 20.54.35.png

契約したVPSを情報が記載されています。

Linux環境構築

Linuxを勉強するにあたって下記のUdemyの講座を購入しました。
【3日でできる】はじめてのLinuxサーバー構築入門(CentOS 7・PHP 7・Docker対応)
セールで1400円ほどで購入しました。

VPS上にCentOSをインストールしてLAMP環境を構築するまでの流れがわかりやすく勉強できたので個人的にはおすすめです。

Linux環境構築する上で躓いたポイント

・ファイヤーウォールを設定してSSHでログインする
 →ファイヤーウォールを設定したポートを確認
 →更新した内容をリロードし反映させる
 →SSHのサーバーにも反映させるためにデーモンを再起動する

・サーバー上の一般ユーザーと特権(root)ユーザーでできること
一般ユーザー=自分のディレクトリ以下のファイルの読み書きができる
特権(root)ユーザー=管理者権限を持つユーザー
※インストールや設定ファイルの変更には管理者権限が必要

一般ユーザーに管理者権限を与える
rootユーザーの命令は絶対であり間違えてシステムファイルなども削除してしまう可能性があるため、基本的には一般ユーザーに管理者権限を与えて操作を行うことが好ましい。

・サーバーに外部からアクセスできるようにファイヤーウォールの設定変更
→これが設定できないとアクセスできない

これが完了してVPSのIPアドレスに接続するとApacheの標準ページが表示される

デフォルトのドキュメントルートが/var/www/htmlなので
例えばこの配下にindex.htmlを置くとその中身が表示される
URLはこんな感じ
xx.xx.xx.xx/index.html

ドメイン取得

IPアドレスのままでも表示はできるが、ウェブアプリを公開するにあたってそのサービスを認知いただくためにドメインの取得は必要

さくらインターネットやお名前.comなどからドメインを取得する
※今回はさくらインターネットから取得

ドメインの設定方法に関しては下記リンクを参照
【ドメイン設定】さくらインターネットで取得・管理中のドメインを利用

要するにサーバーのIPアドレスと取得したドメインを紐付けさせる

設定が完了すると、上記のxx.xx.xx.xx/index.htmlで表示させていたところのIPアドレス部分(xx.xx.xx.xx)を取得したドメイン書き換えても同じようにアクセスできるようになる

Let's encryptで無料SSL証明書発行してSSL化

無料でSSL証明書を発行するために今回はLets encryptを使用

躓いたポイント
インストールして証明書も発行したのにSSL化されない
→証明書発行してからApacheに設定が必要
/etc/httpd/conf.d/ssl.confに

SSLCertificateFile /etc/letsencrypt/live/[サーバーのドメイン]/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[サーバーのドメイン]/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/[サーバーのドメイン]/chain.pem

それぞれ設定する
参考記事
https://weblabo.oscasierra.net/letsencrypt-2/

ドキュメントルート変更

取得したドメインにアクセスした時にサイトが表示されるようにデフォルトのドキュメントルートを変更する

この変更を行わないと、例えばデフォルトの/var/www/html配下にexampleディレクトリを作り、その配下にindex.htmlを置いた場合、URLがドメイン/example/index.htmlと少しブサイクになってしまう

ドメインだけを入力した時にトップページが表示されるように下記の設定を行う

/etc/httpd/conf/httpd.confの下の方にある<VirtualHost *:80>の中にある
DocumentRootを自分が表示させたいディレクトリに変更する

上の例であれば/var/www/htmlになっているドキュメントルートを/var/www/html/exampleにすることによってドメインにアクセスした時にindex.htmlの内容が表示される。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Sign In with Apple】iOSアプリから投げられたidentityTokenをPHPで認証する

概要

identityToken というJWTがアプリから届いてパースしてsubをユニークキーとして認証するのですが
改ざん防止の為、正しくデコードする必要があります。

細かいことはバージョンが違ったり環境で変わってくると思うので大まかな流れだけ書いておきます。

  • appleの公開鍵を取得
  • 取得した公開鍵を利用して検証
  • 問題なければ取得できた値から sub を利用して認証

以上!!

要所要所の僕が使った部分を以下に記載してるので参考になれば幸いです。

JWTとは

JWT(ジョット)とは JSON Web Token の略で、電子署名付きの URL-safe(URLとして利用出来る文字だけ構成される)な JSONのことです。
電子署名により、JSON の改ざんをチェックできるようになっています。

ざっくり言うと、改ざんできない JSON ということになります。

JWT について調べた内容をまとめました。

パースしてみる

こちらのサイトでパース出来るので便利でした。
https://jwt.io/

Appleの鍵を取得する

Appleの鍵はこちらにありました。
Fetch Apple's public key for verifying token signature

Appleの鍵をFirebaseのJWTライブラリが理解出来る形に変更する

JWTの検証にFirebaseのライブラリを使ったのですが、複数の鍵で署名されてる場合
配列で鍵を指定出来るのですが形式が以下のような形なので変換して上げる必要があります。

Appleの鍵の中にあるenを使ってPEMを作れるので頑張って作ります。
この方の記事をめちゃくちゃ参考にさせてもらいました。
【PHP】AzureAPIなどで配布されている公開鍵の「e」「n」とはなにで、どう使うのか

$publicKeys = [
    'kidの値' => 'PEM形式のテキスト',
    'kidの値' => 'PEM形式のテキスト',
];

JWTの検証をして中身を取得する

Firebaseのライブラリを使って
アプリから投げられた identityTokenとさっき作った公開鍵の配列とAppleの鍵に書いてあった alg の値 RS256を指定すれば
改ざんされてなければJSONが返ってきます。

$payload = JWT::decode($identityToken, $publicKeys, ['RS256']);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

phpの配列の中身を手っ取り早く確認する

「変数に代入とかしないで配列の中身確認をパパっと確認したいんだけど!?」
ってなったので調べてた。
どうやらprint_r()って関数を使うといいっぽい。

配列の中身を確認する

通常配列

$data = ['yamada', 'takahashi'];

print_r ($data);

//実行結果
Array (
 [0] => yamada
 [1] => takahashi
)

連想配列

$data = ['yamada' => 123, 'takahashi' => 456];

print_r ($data);

//実行結果
Array (
 [yamada] => 123
 [takahashi] => 456
)

多次元配列

$data = [
  [
    'name' => '山田',
    'age' => 123,
    'sex' => '男',
  ],
  [
    'name' => '高橋',
    'age' => 345,
    'sex' => '女'
  ],
];

print_r ($data);

//実行結果

Array (
 [0] => Array (
   [name] => 山田
   [age] => 123
   [sex] => 
 )
 [1] => Array (
   [name] => 高橋
   [age] => 345
   [sex] =>  )
)

おわり

ブラウザだと改行が省略されて表示されるので、ソースを表示機能を使って確認すると見やすい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

php配列の中身を手っ取り早く確認する

配列の中身を確認する

「配列の中身をパパっと確認したいんだけど!?」
ってなったので調べてみた。

print_r()var_dump()って関数を使うといいっぽい。

print_r()var_dump()の違い

print_r()で出力

  • 配列であるという情報
  • 各要素の値

var_dump()で出力

  • 配列全体の要素数
  • 各要素のデータ型
  • 各要素の値のバイト数
  • 各要素の値

var_dump()はデータ型も加味した情報を確認したいときに便利みたい。

print_r()で出力

通常配列

$data = ['yamada', 'takahashi'];

print_r ($data);

//実行結果
Array (
 [0] => yamada
 [1] => takahashi
)

連想配列

$data = ['yamada' => 123, 'takahashi' => 456];

print_r ($data);

//実行結果
Array (
 [yamada] => 123
 [takahashi] => 456
)

多次元配列

$data = [
  [
    'name' => '山田',
    'age' => 123,
    'sex' => '男',
  ],
  [
    'name' => '高橋',
    'age' => 345,
    'sex' => '女'
  ],
];

print_r ($data);

//実行結果

Array (
 [0] => Array (
   [name] => 山田
   [age] => 123
   [sex] => 
 )
 [1] => Array (
   [name] => 高橋
   [age] => 345
   [sex] =>  )
)

var_dump()で出力

通常配列

$data = ['yamada', 'takahashi'];

var_dump($data);

//実行結果
array(2) {
 [0]=> string(6) "yamada"
 [1]=> string(9) "takahashi"
 }

連想配列

$data = ['yamada' => 123, 'takahashi' => 456];

var_dump($data);

//実行結果
array(2) {
 ["yamada"]=> int(123)
 ["takahashi"]=> int(456)
 }

多次元配列

$data = [
  [
    'name' => '山田',
    'age' => 123,
    'sex' => '男',
  ],
  [
    'name' => '高橋',
    'age' => 345,
    'sex' => '女'
  ],
];

var_dump($data);

//実行結果
array(2) {
 [0]=> array(3) {
 ["name"]=> string(6) "山田"
 ["age"]=> int(123)
 ["sex"]=> string(3) "男"
 }
 [1]=> array(3) {
 ["name"]=> string(6) "高橋"
 ["age"]=> int(345)
 ["sex"]=> string(3) "女"
 }
}

おわり

ブラウザだと改行が省略されて表示されるので、ソースを表示機能を使って確認すると見やすい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本日の学習内容Part1

参考記事

mpywさんのPHPでデータベースに接続するときのまとめ

DBに接続する

 $db = new PDO('mysql:dbname=mydb; host=127.0.0.1; charset=utf8;', 'root' , '');

mydb-> データベース名
127.0.0.1->ローカルサーバIPアドレス
charset=utf8->文字セット
root->ユーザー名(管理者権限の場合はroot)
'(空)'->パスワードを状況によって設定

DB接続した時の例外処理

 try{
   $db = new PDO('mysql:dbname=mydb; host=127.0.0.1; charset=utf8;', 'root' , '');
} catch(PDOException $e) {
 echo 'DB接続エラー:' . $e->getMessage();
}

感想

try~catch句はなかなか使う機会が多そうなので、使いこなせるようにポートフォリオ作りにも積極的に使っていこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPで現在時刻出したら8時間ずれてたお話

はじめに

Unity勉強し始めたばっかですが 最近PHPの勉強し始めました。
その中でつまった部分をQiitaに書き残して、これからPHP始める人たちの助けになれたらなと思ってます。

現在時刻を表示してみる

dateを使って現在時刻を表示するプログラムを作成してみます。
※フォーマットは以下サイトを参考につけました
https://www.php.net/manual/ja/function.date.php

date.php
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>現在日付を出す</title>
    </head>
    <body>
        <?php
        print("今は".date('H')."時".date('i')."分");
        ?>
    </body>
</html>

現在時刻が15時50分なのになぜか「今は07時50分」と表示される・・・。

php.iniのdate.timezone

dateはphp.iniの中のdate.timezoneをもとに現在時間を取得しているそうです。
値を確認したら以下の通りになってました。

php.ini
date.timezone=Europe/Berlin

ベルリン\(^o^)/

インストールしてから設定を変更した記憶が無いのでデフォルトがベルリン (ドイツ) になっているっぽい。
なので日本に書き換えます。

php.ini
date.timezone=Asia/Tokyo

書き換えたらapacheを再起動して再表示したら正しい時刻が取れました!

これからもつまったとこがあったらできるだけ記事にしていこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Tinderの自動スワイプ最新版

以前まで使っていたTinderの自動右スワイプコードが使えなくなってしまったようなので新しいコードを書いてみました。初めて作ったコードなので雑かもしれないですがちゃんと動くので許してください...

auto = setInterval(
    function(){
        var elem = document.getElementsByClassName("focus-button-style");
        var i = elem.length -2;
        elem[i].click()
    }
,1000)

一応やり方も。
(1)ChromeでTinderのスワイプ画面を開く
(2)右クリック→検証
(3)Console画面に移動
(4)上に書いたコードを丸々コピペしてEnter
以上!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コード品質を改善できるツール

Visual Studio Code (VSCode)の良いプラグイン

Region folding

Region folding

Better comments

Better comments

PHP DocBlocker

PHPDocBlockerの記述を容易にしてくれる。例えば、「/**」と入力して[Tab]キーを押せば、そのスケルトンを自動生成してくれる。また、「@」で始まるタグ名の補完も可能だ(PHP IntelliSenseではこれはサポートされていない)

PHP DocBlocker

Text Maker (High light)

Rainbow brackets

GitLens

GitBlame

Git History

Gitのコメントの良い方法

Conventional Commitsの仕様は、コミットメッセージのための軽量の規約です。 明示的なコミット履歴を作成するための簡単なルールを提供します、この規則に従うことで自動化ツールの導入を簡単にします。 この規約はSemVerと組み合わせることで、コミットメッセージへ機能、修正、重大な変更を入れることで、さらに詳細な説明を可能にします。
- Conventional commit (https://www.conventionalcommits.org/ja/)
Conventional commit

コード品質をチェック

  • PHP-CS-Fixer
  • PHPMD (日本語) PHPMD バグにつながりそうな怪しい ソースコードをチェックして教えてくれる phpmd。 コーディング時に必ず使うようにしておくとミスやバグが減るので是非使いましょう Screen Shot 2020-03-19 at 13.41.56.png

ボーナス

  • Octotree GitHubのエクスペリエンスを次のレベルに引き上げるブラウザー拡張機能。 このリポジトリには、Octotree Coreのソースコードが含まれています。 ローカルでビルドおよび実行して、無料版のすべての機能にアクセスできます。 または、当社のウェブサイトからフルバージョンをダウンロードできます。 Octotreeは、Chrome、Firefox、Opera、およびSafariをサポートしています。 octotree
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ウェブサービスの主な機能について

主な機能一覧

ユーザー管理

1.ユーザー登録機能
2.ログイン機能
3.ログアウト
4.プロフィール登録
5.プロフィール編集
6.退会
7.パスワード変更
8.パスワードリマインダー
9.管理者ユーザー登録

コンテンツ管理

10.コンテンツ登録
11.コンテンツ編集
12.コンテンツ削除
13.コンテンツ一覧表示
14.コンテンツ詳細表示
15.コンテンツ検索
16.お気に入り登録
17.決済

基本的には上記の機能を実装し、そこに追加で機能を付け足していくことでほとんどのウェブサービスを作ることが可能になる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】php artisan migrateでハマったので、XAMPP環境でPostgreSQLを使ってみた。

migrateでエラーが出まくった。。。

いつもお世話になっているTechpitの教材で学習していた際に、migrateで思いっきりハマり、解決できなかったのでXAMPPでPostgreSQLを使えるようにしてみました。その際のメモです。

学習に使用している教材のリンク:
https://www.techpit.jp/p/laravel-vue-sns

こちら作りながら学べる学習教材で楽しみながらミドルウェア、認可、フロントエンドとの連携などかなり深いところまで学べるのでめちゃくちゃおススメです!!

自身の学習環境に関して


教材ではMac、Docker、PostgreSQLを用いて学習します。

僕の場合はWindowsユーザーでDocker(Docker for Windows)の環境構築を以前挫折した経緯があったので、Windows、XAMPP、MariaDB(MySQL)で学習していました。

つまり、教材をじぶんの環境に合わせて読み替える必要がありました。(僕にこれができるスキルはまだなかったってことです。。。泣)

データベースの構成


この教材のデータベースの構成は以下になります。(無料で見れる範囲の内容ですので引用させていただいております。)

https://www.techpit.jp/courses/777553/lectures/14528046


順番としては、articlesテーブルを作った後に、likesテーブルを作るのですが、likesテーブルを作ろうとしたところエラーが出るようになってしまいました。(超絶序盤。)

どうハマったのか


※これに関しては解決できなかったので、原因分かり次第追記します。※

どうやら外部キー制約関連で違いがある(負の値の無い数値型にするのがポイント)とのことです。

嘆いていたところやんばるさん(著者)からご教授いただきました。ありがとうございます。泣

参考(教えていただきました。):
https://qiita.com/0w0/items/4a9cb7d27794bfb93d46#%E5%8E%9F%E5%9B%A0

さっそくご教示いただいた通り、unsigned()を付けて、php artisan migrateを実行!!

ところが。。。

SQLSTATE[HY000]: General error: 1005 Can't create table laravel_vue_sns.articles (errno: 150 "Foreign key constraint is
key (user_id) references users (id))

laravel_vue_sns.articlesを作成できません(errno:150"外部キー制約はキー( user_id)はusersid)を参照します)
SQLSTATE[HY000]: General error: 1005 Can't create table laravel_vue_sns.articles (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter tarticles(errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter tablearticlesadd constraintarticles_user_id_foreignforeign key (user_id) referencesusers(id`))

laravel_vue_sns.articlesを作成できません(errno:150"外部キー制約の形式が正しくありません ")(SQL:alter tarticles(errno:150"外部キー制約が正しくありません (SQL:変更テーブルarticles制約の追加 articles_user_id_foreign外部キー(user_id)参照 usersid`))

こうなる。

続いて教えていただいたQiitaの記事を参考に自分のスクリプト見ながら睨めっこ。

increments()で作ったカラムには、実は裏でunsined(符号無し)属性が付与される。要は採番項目なので正の値しか登録できないわけだが、役割テーブル側のuser_idauthority_idには同様の制約を付けていない。

https://qiita.com/0w0/items/4a9cb7d27794bfb93d46#%E5%8E%9F%E5%9B%A0


自分のマイグレーションファイルでは、bigIncrementsで記載していることに気付く。

違いを調べてみました。

参考:
https://qiita.com/fuubit/items/17f3eb306c64ede163d2


どうやらbigIncrements()は負の値も登録できてしまうっぽい。

ってことで、全てincrements()に変えてみました。

が、先ほどと同様にエラーが出てしまいました。。。

解決できず。。。泣

環境の違いだけでここまで躓くものかと痛感。。。(何回目だ。。。)

XAMPPでPostgreSQLを使ってみた。


ってことで、キッパリ諦めてXAMPPでPostgreSQLを使う形に挑戦してみました。(Dockerにも再挑戦しましたがcompose upができず再挫折。。。)

参考:
https://tasulife-23.com/xampp-postgresql/

この記事では、PHPファイルからPostgreSQLまでのつなぎ方が記載されています。

ざっくりこんな内容です。

その後、Laravelに紐づけるためには.envファイルを編集する必要があります。

DB_CONNECTION=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_DATABASE=test
DB_USERNAME=postgres
DB_PASSWORD=secret(ここはご自身で設定したパスワードを記載してください。)

僕の場合はこんな感じです。

別途、データベースを用意する必要があるのでデータベースを作成。

psql -U postgres -c "create database test;

その後、マイグレーション。

無事、マイグレーションすることができました。

 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あると便利な PHP の配列関数

作った理由

とあるプロジェクトで自動化システムを作っています。
大変複雑で、配列を使いまわしているうちに、何度も使う処理を必要にかられて関数にしました。

なんでこういう関数がないんだろう? と同じように思われている方の参考になれば幸いです。

  • array_same ... 単純ですが本当にこれがないと大変です…。
  • array_remove ... 同名の関数が PostgreSQL にはあります。PHP にはないのが不思議です。

2020.03.19 ブログの方でコメントを頂き、array_same を短縮化しました。pickles さん、ありがとうございます。


配列の中の値がすべて同じか

/**
 * 配列の中の値がすべて同じか
 * @param array $array 配列
 * @return bool
 */
function array_same($array)
{
    return count(array_unique($array)) === 1;
}

配列から指定の値を削除

/**
 * 配列から指定の値を削除
 * @param array $array 削除対象の配列
 * @param array $val 削除する値を配列で指定
 * @return array
 */
function array_remove($array, $val)
{
    // 取り除いた後、インデックスは元のままなので詰める
    return array_values(array_diff($array, $val));
}

ブログ に同じ記事を掲載しています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 配列に連想配列を入れる

目的

  • 配列の中に連想配列を入れる方法をまとめる

実施環境

  • MacOS上のローカル環境にテスト用スクリプトファイルを作成してVisual Studio Codeのデバッグを用いて結果を確認した。
  • 下記にVisual Studio CodeでPHPのデバッグ環境を構築する際の手順をまとめた記事へのリンクを記載する。
  • 下記に実施環境の詳細な情報を記載する。
項目 情報
OS macOS Catalina(10.15.3)
ハードウェア MacBook Air (11-inch ,2012)
プロセッサ 1.7 GHz デュアルコアIntel Core i5
メモリ 8 GB 1600 MHz DDR3
グラフィックス Intel HD Graphics 4000 1536 MB

PHPの配列の書き方

PHPの連想配列の書き方

書き方の例(配列を連想配列に格納する)

  • 下記に配列$testに連想配列('num1' => 10, 'num2' => 20, 'num3' => 30)を格納する方法をまとめる。
  • 下記が実行されると配列$test[0]には'num1' => 10, 'num2' => 20, 'num3' => 30の連想配列が格納される。

    $test = [
        [
            'num1' => 10,
            'num2' => 20,
            'num3' => 30
        ]
    ];
    

書き方の例(配列に入った連想配列を出力する)

  • 先の「書き方の例(配列を連想配列に格納する)」のコードを引き継いで説明する。
  • 配列名[インデックス番号][連想配列のキー]と言うように指定することで格納された値を得ることができる。
  • 配列$testのnum1~num3の値を出力したい時の例を下記に記載する。

    $test = [
        [
            'num1' => 10,
            'num2' => 20,
            'num3' => 30
        ]
    ];
    #---これより上は「書き方の例(配列を連想配列に格納する)」のコードと一緒---#
    
    # num1を出力する
    echo $test[0]['num1'];
    
    # num2を出力する
    echo $test[0]['num2'];
    
    # num3を出力する
    echo $test[0]['num3'];
    

書き方の例(配列に入った連想配列の末尾にデータを追加する)

  • 先の「書き方の例(配列を連想配列に格納する)」のコードを引き継いで説明する。
  • array_push(配列名,末尾に追加するデータと言うように指定することでデータを追加することができる。
  • 下記に配列$testの末尾に連想配列('num1' => 40, 'num2' => 50, 'num3' => 60)を格納する方法をまとめる。

    $test = [
        [
            'num1' => 10,
            'num2' => 20,
            'num3' => 30
        ]
    ];
    #---これより上は「書き方の例(配列を連想配列に格納する)」のコードと一緒---#
    
    array_push($test, [
        'num1' => 40,
        'num2' => 50,
        'num3' => 60
    ]);
    
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Wordpressでプラグインを使わずに関連記事を表示する方法 2020年版

関連記事は、関連度やタグもカテゴリも含むなど高度な設定が必要な場合はプラグインを使ったほうが早いかも。

ここでは簡単な関連記事の取得方法をまとめる。

プラグイン使わず関連記事を実装

functions.phpに以下のコードを追記。

// functions.php
function my_get_related_posts( $post_id, $related_count ) {
  // 記事のカテゴリを取得、タグでも可
  $terms = get_the_terms( $post_id, 'category' );

  if ( empty( $terms ) ) $terms = array();

  // カテゴリ一覧のslugを作成
  $term_list = wp_list_pluck( $terms, 'slug' );

  // クエリの設定、投稿タイプはパラメータで変更できるようにしても良い
  $related_args = array(
    'post_type' => 'post',  // 投稿タイプ
    'posts_per_page' => $related_count, // 表示数
    'post_status' => 'publish', // 公開されてるもののみ表示
    'post__not_in' => array( $post_id ),  // 現在の記事を含めない
    'orderby' => 'rand',  // ランダム、DESCで新着順に変更可能
    'tax_query' => array(
      array(
        'taxonomy' => 'category', // カテゴリから取得
        'field' => 'slug',  // $term_listでslugとってるので合わせる
        'terms' => $term_list // カテゴリ一覧のslugを渡す
      )
    )
  );
  return new WP_Query( $related_args );
}

テンプレートに関連記事

あとはテンプレートの表示したい位置にループ処理を書き込むだけ。

<h1>関連記事</h1>
<ul>
<?php
global $post;
$wp_query = my_get_related_posts( $post->ID, 6 );
if ($wp_query->have_posts()) : while ($wp_query->have_posts()) : 
  $wp_query->the_post(); ?>

    <li>
      <a href="<?php echo get_permalink(); ?>">
        <img src="<?php echo get_the_post_thumbnail_url(); ?>" alt="<?php echo get_the_title(); ?>">
        <p><?php echo get_the_title(); ?></p>
      </a>
    </li>

<?php endwhile; endif; wp_reset_postdata(); ?>
</ul>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む