blog

[WordPress] 記事に番号を振る・表示する

Category : WordPress

こんにちは、札幌でWEBサイト制作を行なっている石田です。
今回はWordPressで記事に連番を振る方法を紹介します。

通常の投稿やカスタム投稿でも使用できるので、きっと役に立つと思います。

通常の投稿タイプに番号を振る方法

<?php
  $where = $wpdb->prepare("WHERE p.post_date >= %s AND p.post_type = %s AND p.post_status = 'publish'", $post->post_date, $post->post_type);
  $sql = "SELECT COUNT(*) FROM $wpdb->posts AS p $where ORDER BY p.post_date DESC";
  $number = (int)$wpdb->get_var($sql);
  echo ('<span>');
  echo esc_html($number);
  echo ('</span>');
?>

上記のコードを表示させたい箇所に入れると下記の画像の様に番号が表示されます。

カテゴリーごとに記事に番号を振る方法

次は下記の画像の様にカテゴリーごとに番号を振る方法です。

functions.phpに書くコード

<?php
// $taxonomy = 'category' としていますが、カスタム投稿の際はタクソノミー名を入れてください → 例)$taxonomy = 'works_cat'
function get_post_number($previous = false, $same_term = true, $taxonomy = 'category')
{
  global $wpdb;

  if ((!$post = get_post()) || !taxonomy_exists($taxonomy))
    return null;

  $current_post_date = $post->post_date;
  $join = '';
  $where = '';

  if ($same_term) {
    $join .= " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
    $where .= $wpdb->prepare("AND tt.taxonomy = %s", $taxonomy);

    if (!is_object_in_taxonomy($post->post_type, $taxonomy))
      return null;

    $terms = get_the_terms($post->ID, $taxonomy);
    if ($terms) {
      $terms = wp_list_sort($terms, array('term_id' => 'ASC'));
      $term = $terms[0];
      $where .= " AND tt.term_id = {$term->term_id}";
    }
  }

  if (is_user_logged_in()) {
    $user_id = get_current_user_id();

    $post_type_object = get_post_type_object($post->post_type);
    if (empty($post_type_object)) {
      $post_type_cap    = $post->post_type;
      $read_private_cap = 'read_private_' . $post_type_cap . 's';
    } else {
      $read_private_cap = $post_type_object->cap->read_private_posts;
    }

    $private_states = get_post_stati(array('private' => true));
    $where .= " AND ( p.post_status = 'publish'";
    foreach ((array) $private_states as $state) {
      if (current_user_can($read_private_cap)) {
        $where .= $wpdb->prepare(" OR p.post_status = %s", $state);
      } else {
        $where .= $wpdb->prepare(" OR (p.post_author = %d AND p.post_status = %s)", $user_id, $state);
      }
    }
    $where .= " )";
  } else {
    $where .= " AND p.post_status = 'publish'";
  }

  $op = $previous ? '<=' : '>=';
  $order = $previous ? 'ASC' : 'DESC';

  $where = $wpdb->prepare("WHERE p.post_date $op %s AND p.post_type = %s $where", $current_post_date, $post->post_type);
  $sql = "SELECT COUNT(*) FROM $wpdb->posts AS p $join $where ORDER BY p.post_date $order";
  $number = (int)$wpdb->get_var($sql);

  return $number;
}

表示させたい箇所に書くコード

<?php
  $number = get_post_number();
  echo ('<span>');
  echo esc_html($number);
  echo ('</span>');
?>

これで記事に番号を振ることができます!

参考にさせていただいた記事は下記です。

WordPress 現在の投稿は何番目?

使用頻度は高く無いですが、いざ実装する時に是非使用してください!