WordPressで記事ページのURLを日付にする際に気をつけること

WordPress

WordPressのパーマリンクで記事を日付のみにしようとすると躓く箇所があったので対策メモです

テンプレートが反映されない

パーマリンクを日付に設定(yyyy-mm-dd)して、記事ページを修正しようとするとなぜかsingle.phpではなくarchives.phpになってしまいました。

何か設定を間違っているのかなと色々WordPressの設定を見てみたけどわからず、ネットを検索したところ以下を見つけました。

WordPressのパーマリンクを日付ベースにする方法 - Rewish
WordPressのパーマリンクを/YYYY/MM/DD/hhmmの様な日付ベースにする方法を紹介。

WordPressのパーマリンクを/YYYY/MM/DD/hhmmの様な日付ベースにしようとすると、日付アーカイブになってしまい記事単体のページとして認識されません。

WordPress側の仕様だったのですね。というわけで記事ページと認識するように以下のコードをfunctions.phpへ追加しました。

add_action('parse_query', 'date_base_permalink');

function date_base_permalink($wp_query) {
  $q = (object)$wp_query->query_vars;

  if (!empty($q->year) && !empty($q->monthnum) && !empty($q->day)) {
    $wp_query->is_single = true;
    $wp_query->is_singular = true;
    $wp_query->is_archive = false;
  }
}

同じ日付に複数投稿すると記事が1つ以外表示されなくなる

今回、西暦・月・日付までの名前にしてしまったので、同じ日に複数の記事を投稿すると1つの記事しかアクセスできなくなってしまいました。

ですので次に日付の後ろにyyyy-mm-dd-xと記事分の数値をつけるようにしました。(1つ目の記事は-xは無し)。下記コードは投稿タイプと投稿で分けたコードです。

<?php
function b2n_replace_slug($slug, $post_ID, $post_status, $post_type) {
    static $is_slug_processing = false;

    if ($is_slug_processing) {
        return $slug; // 無限ループ防止
    }

    $is_slug_processing = true;
    $get_post = get_post($post_ID);

      // スラッグがすでに存在する場合、そのまま返す
    if (!empty($get_post->post_name)) {
        $is_slug_processing = false;
        return $slug;
    }
    if (!$get_post) {
        $is_slug_processing = false;
        return $slug;
    }

    $post_date = $get_post->post_date ? $get_post->post_date : current_time('mysql');
    $formatted_date = date('Y-m-d');
    $args = [
        'date_query' => [
            [
                'before'    => $formatted_date,
                'after'     => $formatted_date,
                'inclusive' => true, // 境界を含む
            ],
        ],
        'post_type'      => 'post',
        'post_status'    => 'any',
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];
    $existing_posts = get_posts($args);
    if (!empty($existing_posts)) {
        // 同じ形式のスラッグを取得
        $existing_slugs = [];
        foreach ($existing_posts as $post_id) {
            $existing_post = get_post($post_id);
            $existing_slugs[] = $existing_post->post_name;
        }
        // スラッグの最大番号を計算
        $max_number = 0;
        foreach ($existing_slugs as $existing_slug) {
            if (preg_match('/^' . preg_quote($formatted_date, '/') . '-(\d+)$/', $existing_slug, $matches)) {
                $max_number = max($max_number, (int) $matches[1]);
            }
        }

        // 次の番号を付加
        $formatted_date .= '-' . ($max_number + 1);

        $slug = sanitize_title($formatted_date);
        $is_slug_processing = false;

        return $slug;
    }
}

add_filter('wp_unique_post_slug', 'b2n_replace_slug', 50, 4);

参考:https://tips.back2nature.jp/wordpress/customize-slug-to-date-automatically/

投稿画面のURLが投稿後に変わらない

公開ボタンを押したあと、記事ページのタイトル下にあるURLがなぜか変わらなかったのですが(クラシックエディタで確認)一度リロードすると治ったため下記のコードを足しました。

function custom_admin_script() {
  ?>
  <script type="text/javascript">
      (function($) {
          $(document).ready(function() {
              function getPermalink() {
                const permalinkURL = $('#sample-permalink a').attr('href');
                const permalinkSplit = permalinkURL.split('/');
                const permalinkFileName = permalinkSplit[permalinkSplit.length - 2];
                return permalinkFileName;
              }

              function getActualURL() {
                  return $('#editable-post-name').text();
              }

              function checkAndUpdate() {
                  var permalink = getPermalink().toLowerCase();
                  var actualURL = encodeURI(getActualURL()).toLowerCase();
                  console.log(permalink,actualURL)

                  // パーマリンクと現在のURLが異なる場合、更新ボタンをクリック
                  if (permalink !== actualURL) {
                    $('#publish').click();
                  }
              }
              checkAndUpdate();

          });
      })(jQuery);
  </script>
  <?php
}
add_action('admin_footer', 'custom_admin_script');

パーマリンクと表示されているURLが違った場合は管理画面をリロードします。

パーマリンクの設定を日付系以外の別のものに設定する

パーマリンク構造をカスタム構造にしているとダメなようなので、設定→パーマリンクの箇所の設定をpostnameにします。(他のものを試してないので、他のでも大丈夫かもしれません)

こちらでやっと実装できました。

パーマリンクを日付のみにするのはやめた方がよさそう

パーマリンクを日付にしただけで結構大変なことになったので、
日付のみというのはやめたほうがいいなと思いましたが、もしやらなければいけない場合は参考になればと思います。

コメント

タイトルとURLをコピーしました