- 投稿日:2020-03-19T23:45:35+09:00
Heroku MySQLのデータベースから持ってきた日本語が文字化けする
3行で
- ClearDBのアドオンでMySQLを使う
- Heroku公式のやり方でMySQLからデータを持ってくる
- 文字コードを指定する
環境
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); ?>原則ここに書いてある内容はいじらなくてよい。
例えばカッコの中身をデータベース名やユーザー名に変える必要はない。
しかしこの形でデータベースから日本語のデータを持ってくると『?????』 といった形で出力されてしまう。これでイケるかと思ったけどダメだった。
解決
$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
- 投稿日:2020-03-19T23:28:27+09:00
Laravel pluckメソッドとか便利メソッド
- 投稿日:2020-03-19T23:28:27+09:00
Laravel plackメソッドとか便利メソッド
- 投稿日:2020-03-19T22:11:04+09:00
さくらVPSでウェブアプリ公開まで
はじめに
ローカル環境で作ったものをサーバー上にアップロードして公開する流れをまとめます。
その中で詰まった部分などを備忘録的にまとめます。ざっと流れ
1 さくらVPSを契約
2 Linux環境の構築
3 ドメイン取得
4 ドキュメントルート変更
5 SSL化1さくらVPS契約
まずはさくらVPSの契約から。
さくらVPS申し込みはこちら
14日間お試し期間があるのでその期間に一通りできれば無料でお勉強できます。
※プランは1Gを選択しました登録が完了する下のようなコントロールパネルにログインできます。
契約した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
の内容が表示される。
- 投稿日:2020-03-19T20:35:15+09:00
【Sign In with Apple】iOSアプリから投げられたidentityTokenをPHPで認証する
概要
identityToken
というJWTがアプリから届いてパースしてsub
をユニークキーとして認証するのですが
改ざん防止の為、正しくデコードする必要があります。細かいことはバージョンが違ったり環境で変わってくると思うので大まかな流れだけ書いておきます。
- appleの公開鍵を取得
- 取得した公開鍵を利用して検証
- 問題なければ取得できた値から
sub
を利用して認証以上!!
要所要所の僕が使った部分を以下に記載してるので参考になれば幸いです。
JWTとは
JWT(ジョット)とは JSON Web Token の略で、電子署名付きの URL-safe(URLとして利用出来る文字だけ構成される)な JSONのことです。
電子署名により、JSON の改ざんをチェックできるようになっています。ざっくり言うと、改ざんできない JSON ということになります。
パースしてみる
こちらのサイトでパース出来るので便利でした。
https://jwt.io/Appleの鍵を取得する
Appleの鍵はこちらにありました。
Fetch Apple's public key for verifying token signatureAppleの鍵をFirebaseのJWTライブラリが理解出来る形に変更する
JWTの検証にFirebaseのライブラリを使ったのですが、複数の鍵で署名されてる場合
配列で鍵を指定出来るのですが形式が以下のような形なので変換して上げる必要があります。Appleの鍵の中にある
e
とn
を使ってPEMを作れるので頑張って作ります。
この方の記事をめちゃくちゃ参考にさせてもらいました。
【PHP】AzureAPIなどで配布されている公開鍵の「e」「n」とはなにで、どう使うのか$publicKeys = [ 'kidの値' => 'PEM形式のテキスト', 'kidの値' => 'PEM形式のテキスト', ];JWTの検証をして中身を取得する
Firebaseのライブラリを使って
アプリから投げられたidentityToken
とさっき作った公開鍵の配列とAppleの鍵に書いてあったalg
の値RS256
を指定すれば
改ざんされてなければJSONが返ってきます。$payload = JWT::decode($identityToken, $publicKeys, ['RS256']);
- 投稿日:2020-03-19T18:40:00+09:00
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] => 女 ) )おわり
ブラウザだと改行が省略されて表示されるので、ソースを表示機能を使って確認すると見やすい。
- 投稿日:2020-03-19T18:40:00+09:00
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) "女" } }おわり
ブラウザだと改行が省略されて表示されるので、ソースを表示機能を使って確認すると見やすい。
- 投稿日:2020-03-19T18:29:36+09:00
本日の学習内容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句はなかなか使う機会が多そうなので、使いこなせるようにポートフォリオ作りにも積極的に使っていこうと思います。
- 投稿日:2020-03-19T16:44:29+09:00
PHPで現在時刻出したら8時間ずれてたお話
はじめに
Unity勉強し始めたばっかですが最近PHPの勉強し始めました。
その中でつまった部分をQiitaに書き残して、これからPHP始める人たちの助けになれたらなと思ってます。現在時刻を表示してみる
dateを使って現在時刻を表示するプログラムを作成してみます。
※フォーマットは以下サイトを参考につけました
https://www.php.net/manual/ja/function.date.phpdate.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.inidate.timezone=Europe/Berlinベルリン\(^o^)/
インストールしてから設定を変更した記憶が無いのでデフォルトがベルリン (ドイツ) になっているっぽい。
なので日本に書き換えます。php.inidate.timezone=Asia/Tokyo書き換えたらapacheを再起動して再表示したら正しい時刻が取れました!
これからもつまったとこがあったらできるだけ記事にしていこうと思います。
- 投稿日:2020-03-19T15:10:30+09:00
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
以上!
- 投稿日:2020-03-19T13:37:26+09:00
コード品質を改善できるツール
Visual Studio Code (VSCode)の良いプラグイン
Region folding
Better comments
PHP DocBlocker
PHPDocBlockerの記述を容易にしてくれる。例えば、「/**」と入力して[Tab]キーを押せば、そのスケルトンを自動生成してくれる。また、「@」で始まるタグ名の補完も可能だ(PHP IntelliSenseではこれはサポートされていない)
Text Maker (High light)
Rainbow brackets
GitLens
GitBlame
Git History
Gitのコメントの良い方法
Conventional Commitsの仕様は、コミットメッセージのための軽量の規約です。 明示的なコミット履歴を作成するための簡単なルールを提供します、この規則に従うことで自動化ツールの導入を簡単にします。 この規約はSemVerと組み合わせることで、コミットメッセージへ機能、修正、重大な変更を入れることで、さらに詳細な説明を可能にします。
- Conventional commit (https://www.conventionalcommits.org/ja/)
コード品質をチェック
- PHP-CS-Fixer
- PHPMD (日本語) PHPMD バグにつながりそうな怪しい ソースコードをチェックして教えてくれる phpmd。 コーディング時に必ず使うようにしておくとミスやバグが減るので是非使いましょう
ボーナス
- 投稿日:2020-03-19T13:21:49+09:00
ウェブサービスの主な機能について
- 投稿日:2020-03-19T12:39:58+09:00
【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)で学習していました。
つまり、教材をじぶんの環境に合わせて読み替える必要がありました。
(僕にこれができるスキルはまだなかったってことです。。。泣)
データベースの構成
この教材のデータベースの構成は以下になります。(無料で見れる範囲の内容ですので引用させていただいております。)
順番としては、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
)はusers
(id
)を参照します)
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)参照
users(
id`))こうなる。
続いて教えていただいたQiitaの記事を参考に自分のスクリプト見ながら睨めっこ。
increments()
で作ったカラムには、実は裏でunsined(符号無し)属性
が付与される。要は採番項目なので正の値しか登録できないわけだが、役割テーブル側のuser_id
とauthority_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;
その後、マイグレーション。無事、マイグレーションすることができました。
- 投稿日:2020-03-19T11:34:22+09:00
あると便利な 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)); }※ ブログ に同じ記事を掲載しています。
- 投稿日:2020-03-19T00:36:19+09:00
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 ]);
- 投稿日:2020-03-19T00:15:40+09:00
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>