WordPress で任意の文字列から投稿やタームの URL を取得

Category : WordPress

WordPress の Wiki Page Links というプラグインを改造していたのですが、そのときのメモです。

このプラグインは [[キーワード]] という書式で固定ページのタイトルに同じものがあれば自動でリンクしてくれるのですが、これの検索範囲を任意の投稿タイプにしたかったのです。
それと、違う書式で (たとえば {{キーワード}} みたいな感じ) で任意のタクソノミーからタームを検索してリンクする、というのもやりたかった。

文中からの検索や置換は元のプラグインのものを流用するとして、問題はキーワードから投稿の URL とタームの URL を探し出すところでした。

// キーワード
$link_target_title = html_entity_decode('探したいキーワード', ENT_QUOTES);

// リンク先 URL
$url = null;

投稿の場合

// 公開されている投稿タイプ
$post_types = get_post_types(array('public' => true));

// 除外したい投稿タイプ
$exclude_post_types = array('post', 'attachment');

// 指定投稿タイプを除外
foreach ($exclude_post_types as $type) {
  unset($post_types[$type]);
}

// 投稿タイプごとにタイトル検索する
foreach ($post_types as $type => $name) {

  // 投稿タイプからタイトル検索 (ない場合は null)
  $page = get_page_by_title($link_target_title, 'OBJECT', $name);

  // 見つかったら投稿 URL を取得してループ抜ける
  if ($page !== null) {
    $url = get_permalink($page->ID);
    break;
  }
}

タームの場合

// 公開されているタクソノミー
$taxonomies = get_taxonomies(array('public' => true), 'names');

// 除外するタクソノミー
$exclude_taxonomies = array('category');

// 指定タクソノミーを除外
foreach ($exclude_taxonomies as $taxonomy) {
  unset($taxonomies[$taxonomy]);
}

// タクソノミーごとにタームを検索する
foreach ($taxonomies as $taxonomy) {

  // タクソノミーからタームを検索 (ない場合は false)
  $term = get_term_by('name', $link_target_title, $taxonomy);

  // 見つかったらタームの URL を取得してループ抜ける
  if ($term !== false) {
    $url = get_term_link(intval($term->term_id), get_taxonomy($taxonomy)->name);
    break;
  }
}

こんな感じかなあ。

Leave a Reply