Unformed Building

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

公開:
更新:

パーマリンク

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;
  }
}

こんな感じかなあ。