WordPressテーマ「SWELL」にて著者情報エリアの著者リンクが流出するので変更する
著者リンク(/author/)が流出して WordPress のログインIDバレが発生するのでなんとかしようと思った。
なんで WordPress って ID をそのまま著者URLに使っちゃうんですか?
https://scrapbox.io/files/66754ebbba86ff001da9eec4.png
やりたいことは
著者情報を表示させたい
著者リンクが流出しないようにしたい
著者ごとに表示内容を変えたい
https://hrdyuic.com/swell-author-information/
最初はこのカスタムHTMLを使ってブログパーツから取り寄せる手法で書き換えてみたんだけど、リンクの書き換えが一括で行えず複数になってしまうことやメンテナンスコストの増大につながりそうだった。
また、著者ごとに書き換える際、php で条件分岐してブログパーツをどこに挿入すればよいかを考えなければならず、バグが増えそうであった。
ブログパーツ自体を「このカテゴリーのCTA」で書き換えても良かったんだけど、これだと著者がカテゴリに依存してしまうので、これも避けたかった。あと、もともと設定していた CTA が上書きされちゃった。
https://scrapbox.io/files/667550977023dc001c143543.png
もっとかんたんな方法があるんじゃないかなーと考えたのが、著者リンクの書き換え。
SWELL の php をのぞいてみると、「get_author_posts_url」を使って取得されていた。
「これ functions.php で書き換えられない?」
Copilot なんかに雑にきいてみると、反映前に横取りして書き換えるフックが予め用意されているらしい。
https://developer.wordpress.org/reference/functions/get_author_posts_url/
apply_filters( ‘author_link’, string $link, int $author_id, string $author_nicename )
よーわからんので補足で調べてみる。
apply_filters と add_filter の違い / 仕様
https://fantastech.net/apply-filters-add-filter
https://www.koikikukan.com/archives/2015/01/09-011111.php
ははーん、なるほど、apply_filters で指定されているフィルター情報は、後に add_filter を付加することで書き換えられるのか。add_filter(<書き換えたいフィルター名>, <値をreturnしてくれる関数>)
apply_filters で指定されているのが「author_link」なので、これをフィルター名(フック)として使えば書き換え可能……みたい。しらんけど。
ということでやってみる。
Theme Functions(functions.php)に記載すればおk。10 は優先順位、3 は引数の数らしい。
code: functions.php
/* 著者リンク 変更 */
function custom_author_posts_url($link, $author_id, $author_nicename) {
$link = 'ここにSNSなどのリンク';
return $link;
}
add_filter('author_link', 'custom_author_posts_url', 10, 3);
home_url(/path/) で 自サイトのURL/path/ を指すらしいのでこういう関数を使っても良さそう。
https://tcd-theme.com/2023/12/wp-home-url.html
著者が複数いて、ID ごとに判定して書き換えたければこうなる。
デフォでは多分「1」、それ以外の著者はユーザー一覧で見たときに、/wp-admin/user-edit.php?user_id=2 みたいに表示された。多分これ user_id=2 がユーザーIDになる。何も当てはまんないときの else は保険としても付けておいたほうが良さげ。
code: functions.php
/* 著者リンク 変更 */
function custom_author_posts_url($link, $author_id, $author_nicename) {
if ($author_id === 1) {
$link = 'リンク1';
} elseif ($author_id === 2) {
$link = 'リンク2';
} else {
$link = 'トップページへのリンクなど';
}
return $link;
}
add_filter('author_link', 'custom_author_posts_url', 10, 3);
条件分岐に成功して動いていたのでおk。
https://scrapbox.io/files/667551b392b57a001d9c86fd.png
#技術メモ #WordPress