🔖

wordpressのfunctionに追加した関数まとめ

2023/02/09に公開

テーマ内のfunction.phpに追記して使うちょっとした関数をまとめておきます。
やってることは簡単ですが、色々と使うことが多いので、使ってください。

一覧表示時に文字数制限して本文を一部表示する


こんな感じで本文の冒頭部分を少しだけ一覧に表示するときに使います。 
文字数を指定することで文字数がそれ以上の場合に…で表現してくれます。

// ■呼び出し方
<?php echo WordRestrictive('本文全部','文字数'); ?>
// 例)
<?php echo WordRestrictive(the_content(),70); ?>
function.php内の記述
function WordRestrictive($content, $word_count)
{
 if (mb_strlen($content) > $word_count) {
   $WordRestrictive = strip_tags(substr($content, 0, $word_count) . '…');
 } else {
   $WordRestrictive =  $content;
 }
 return $WordRestrictive;
}

パンくず


プラグインなしでパンくずの表示関数です。
デザインも自由に当てることができるので、割と使いやすいと思います。
ただfunction.phpへの記述量が多いなと思っているので、ここは改善できるところかもですね。

// ■呼び出し方(本当にこのまま使えばOK)
<?php breadcrumbs($args); ?>
function.php内の記述
function get_breadcrumb_items($args)
{
  global $wp_query;
  global $post;
  $items = array();
  if (is_front_page()) {
    if ($args['home']) {
      $items[] = array('title' => $args['home_template'], 'link' => false);
    }
    return $items;
  }
  if ($args['home']) {
    $items[] = array('title' => $args['home_template'], 'link' => home_url('/'));
  }
  $post_type = get_post_type();

  if ('post' === $post_type && !is_search()) {
    if ($blog_id = get_option('page_for_posts')) {
      $items[] = array('title' => get_the_title($blog_id), 'link' => get_page_link($blog_id));
    }
  } else {
    if (is_post_type_archive()) {
      $items[] = array('title' => post_type_archive_title(null, false), 'link' => false);
    }
  }

  if (is_home()) {
    $items[] = array('title' => wp_title('', false), 'link' => false);
  } elseif (is_single()) {
    $post_type = get_post_type($post->ID);
    if ('post' === $post_type) {
      if ($cats = get_the_category($post->ID)) {
        $current_cat = null;
        foreach ($cats as $cat) {
          if (!$current_cat || cat_is_ancestor_of($current_cat, $cat)) {
            $current_cat = $cat;
          }
        }
        if ($current_cat->parent) {
          $ancestor_cat_ids = array_reverse(get_ancestors($current_cat->cat_ID, 'category'));
          foreach ($ancestor_cat_ids as $cat_id) {
            $items[] = array('title' => get_cat_name($cat_id), 'link' => get_category_link($cat_id));
          }
        }
        $items[] = array('title' => get_cat_name($current_cat->cat_ID), 'link' => get_category_link($current_cat->cat_ID));
      }
    } else {
      $post_type_object = get_post_type_object($post->post_type);
      if (false !== $post_type_object->has_archive) {
        $items[] = array('title' => $post_type_object->labels->name, 'link' => get_post_type_archive_link(get_post_type()));
      }
    }
    $strtitle = the_title('', '', false);
    if (!isset($strtitle) || $strtitle == '') {
      $strtitle = $post->ID;
    }
    $items[] = array('title' => $strtitle, 'link' => false);
  } elseif (is_category()) {
    $cat = get_queried_object();
    if ($cat->parent) {
      $ancestor_cat_ids = array_reverse(get_ancestors($cat->cat_ID, 'category'));
      foreach ($ancestor_cat_ids as $cat_id) {
        if (!in_array($cat_id, $args['exclude_categorys'])) {
          $items[] = array('title' => get_cat_name($cat_id), 'link' => get_category_link($cat_id));
        }
      }
    }
    $items[] = array('title' => $cat->cat_name, 'link' => false);
  } else if (is_tag()) {
    $tag_id = get_query_var('tag_id');
    $tag = get_tag($tag_id);
    if ($tag) {
      $items[] = array('title' => $tag->name, 'link' => false);
    }
  } elseif (is_tax()) {
    $query_obj = get_queried_object();
    $post_types = get_taxonomy($query_obj->taxonomy)->object_type;
    $cpt = $post_types[0];
    $items[] = array('title' => get_post_type_object($cpt)->label, 'link' => get_post_type_archive_link($cpt));
    $taxonomy = get_query_var('taxonomy');
    $term = get_term_by('slug', get_query_var('term'), $taxonomy);
    if (is_taxonomy_hierarchical($taxonomy) && $term->parent != 0) {
      $ancestors = array_reverse(get_ancestors($term->term_id, $taxonomy));
      foreach ($ancestors as $ancestor_id) {
        $ancestor = get_term($ancestor_id, $taxonomy);
        $items[] = array('title' => $ancestor->name, 'link' => get_term_link($ancestor, $term->slug));
      }
    }
    $items[] = array('title' => $term->name, 'link' => false);
  } elseif (is_year()) {
    $items[] = array('title' => get_the_time(_x('Y', 'breadcrumb year format', 'jp-for-twentytwentyone')), 'link' => false);
  } elseif (is_month()) {
    $items[] = array('title' => get_the_time(_x('Y', 'breadcrumb year format', 'jp-for-twentytwentyone')), 'link' => get_year_link(get_the_time('Y')));
    $items[] = array('title' => get_the_time(_x('F', 'breadcrumb month format', 'jp-for-twentytwentyone')), 'link' => false);
  } elseif (is_date()) {
    $items[] = array('title' => get_the_time(_x('Y', 'breadcrumb year format', 'jp-for-twentytwentyone')), 'link' => get_year_link(get_the_time('Y')));
    $items[] = array('title' => get_the_time(_x('F', 'breadcrumb month format', 'jp-for-twentytwentyone')), 'link' => get_month_link(get_the_time('Y'), get_the_time('m')));
    $items[] = array('title' => get_the_time(_x('d', 'breadcrumb day format', 'jp-for-twentytwentyone')), 'link' => false);
  } elseif (is_page()) {
    $post = $wp_query->get_queried_object();
    if ($post->post_parent == 0) {
      $items[] = array('title' => get_the_title('', '', true), 'link' => false);
    } else {
      $ancestors = array_reverse(get_post_ancestors($post->ID));
      array_push($ancestors, $post->ID);
      foreach ($ancestors as $ancestor) {
        $strtitle = get_the_title($ancestor);
        if (!isset($strtitle) || $strtitle == '') {
          $strtitle = $post->ID;
        }
        if ($ancestor != end($ancestors)) {
          $items[] = array('title' => strip_tags(apply_filters('single_post_title', $strtitle)), 'link' => get_permalink($ancestor));
        } else {
          $items[] = array('title' => strip_tags(apply_filters('single_post_title', $strtitle)), 'link' => false);
        }
      }
    }
  } elseif (is_search()) {
    $items[] = array('title' => __('Search Results', 'jp-for-twentytwentyone'), 'link' => false);
  } elseif (is_404()) {
    $items[] = array('title' => __('404', 'jp-for-twentytwentyone'), 'link' => false);
  }
  return $items;
}
function get_breadcrumb($args = array())
{
  $defaults = array(
    'before' => '<nav id="breadcrumb" role="navigation" class="alignwide">',
    'after' => '</nav>',
    'home' => true,
    'home_template' => 'TOP',
    'exclude_categorys' => array()
  );
  $args = wp_parse_args($args, $defaults);
  $items = get_breadcrumb_items($args);

  $html = $args['before'];
  $html .= '<ul itemscope itemtype="https://schema.org/BreadcrumbList" class="breadcrumbs">';
  foreach ($items as $index => $item) {
    $html .= '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
    if ($item['link']) {
      $html .= '<a itemprop="item" href="' . $item['link'] . '"><span itemprop="name">' . $item['title'] . '</span></a>';
    } else {
      $html .= '<span itemprop="name">' . $item['title'] . '</span>';
    }
    $html .= '<meta itemprop="position" content="' . ($index + 1) . '" />';
    $html .= '</li>';
  }
  $html .= '</ul>';
  $html .= $args['after'] . "\n";

  return $html;
}
function breadcrumbs($args)
{
  echo get_breadcrumb($args);
}

デフォルトの「投稿」を任意の名前に変更する

コーポレートの作成の場合などで多いのが「お知らせ」や「NEWS」、「プレスリリース」などがよく使うものかなと思います。
もちろんデフォルトでWordPressにある「投稿」をお知らせとして使用することに何の問題もないのですが、実際のサイト使用者がITリテラシーが高いとは限りませんので、説明をする前提だとしても「投稿」が「お知らせ」です、
というの直接的ではないのでわかりにくいと思います。
なので、管理画面上の「投稿」を「お知らせ」などの任意の文章に変えてあげるのがベターなのかなと思うので、サイト上の見出しの名称に合わせて変更して使用してください。
下記コードに2箇所ある、

$name='お知らせ';

を任意の言葉に変更したら、管理画面のメニュー表記が変わります。

function.php内の記述
function Change_menulabel() {
	global $menu;
	global $submenu;
	$name = 'お知らせ';
	$menu[5][0] = $name;
	$submenu['edit.php'][5][0] = $name.'一覧';
	$submenu['edit.php'][10][0] = '新しい'.$name;
}
function Change_objectlabel() {
	global $wp_post_types;
	$name = 'お知らせ';
	$labels = &$wp_post_types['post']->labels;
	$labels->name = $name;
	$labels->singular_name = $name;
	$labels->add_new = _x('追加', $name);
	$labels->add_new_item = $name.'の新規追加';
	$labels->edit_item = $name.'の編集';
	$labels->new_item = '新規'.$name;
	$labels->view_item = $name.'を表示';
	$labels->search_items = $name.'を検索';
	$labels->not_found = $name.'が見つかりませんでした';
	$labels->not_found_in_trash = 'ゴミ箱に'.$name.'は見つかりませんでした';
}
add_action( 'init', 'Change_objectlabel' );
add_action( 'admin_menu', 'Change_menulabel' );

Discussion