連載第196回
2024年3月24日
タグクラウドの表示数制限(45個)を解除する方法を知らなかったのでChatGPTに全てやってもらった

以前から、WordPressの下部に設置したカテゴリーやタグの群れを表示させているエリアをぼんやり眺めていて「タグのボタン、何となく少ないなー」と薄々感じてはいたのですが、ちょっと自分で書いた大昔の記事を探していた時に、自分ではタグをつけたつもりでいた記事のタグが表示されておらず、見つけ出すのに非常に手間がかかったことがありました。そこでググってみると「WordPressのタグクラウド表示数はデフォルトで45個まで」ということが判明。

10年使っていて初めて知った。

それが去年のことです。それまではネットで紹介されていたコードを使わせてもらい(↓)、function.PHPに追記してタグクラウドを表示させていました。

function ex_wp_tag_cloud( $tags ) {
    $match = array(
        "/ class='tag-link-(\d+)'/i",                          //クラス、除去しないならこの行を削除
        "/ title='([^']+)'/i",                                 //マウスホバーで表示されるタイトル、除去しないならこの行を削除
        "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",    //文字サイズ
    );
    return preg_replace( $match, '',  $tags );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

下記の「wp_tag_cloud();」をフッターの配置したい場所に挿入。

<?php wp_tag_cloud(); ?>

しかし、このままだとタグクラウドの表示数制限45個を超えることができないようです。解決できないかどうか調べてみると、ネットで紹介されている対処方法は、ほぼ全て、ウィジェットのタグクラウドについて紹介されたものばかりでした。自分のブログテーマには、ウィジェットは全く使用していないのです。

もう自分で調べるのが面倒くさくてChatGPTに聞いてみることにした

Googleの検索結果を果てしなくスクロールしてもウィジェット版対処法ばかり。これはもう、ChatGPTに相談した方が早いんじゃないのか?と頭を切り替えました。

さて、どうやって要望を伝えれば良いものか…。まずは現状使用中のものと、ネットに溢れているウィジェット対処法の2つを提示して、そこからこちらの意図を汲み取ってくれないだろうかという、弱者にありがちな淡い期待を込めたリクエストを投げてみました。

次のA,B 2つのfnctionを、一つにまとめて、
最大数300のタグクラウドを出力するように改造してください。

A:

function ex_wp_tag_cloud( $tags ) {
    $match = array(
        "/ class='tag-link-(\d+)'/i",                          //クラス、除去しないならこの行を削除
        "/ title='([^']+)'/i",                                 //マウスホバーで表示されるタイトル、除去しないならこの行を削除
        "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",    //文字サイズ
    );
    return preg_replace( $match, '',  $tags );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

B:

function my_tag_cloud_number_filter($args) {
  $myargs = array(
    'number' => 300,
  );
  $args = wp_parse_args($args, $myargs);
  return $args;
}
add_filter('widget_tag_cloud_args', 'my_tag_cloud_number_filter');

以下のように、AとBの2つの関数を一つに統合し、最大数300のタグクラウドを出力する関数を作成します。

function custom_tag_cloud($tags) {
  $match = array(
    "/ class='tag-link-(\d+)'/i",                          //クラス、除去しないならこの行を削除
    "/ title='([^']+)'/i",                                 //マウスホバーで表示されるタイトル、除去しないならこの行を削除
    "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",    //文字サイズ
  );
  $tags = preg_replace($match, '', $tags);

  $args = array(
    'number' => 300,
  );

  return wp_generate_tag_cloud($tags, $args);
}

add_filter('wp_tag_cloud', 'custom_tag_cloud');

このコードでは、custom_tag_cloudという新しい関数を作成し、Aの処理とBの処理を組み合わせました。$tagsを受け取り、Aの処理でタグクラウドの表示をカスタマイズし、Bの処理で最大数を300に設定します。最後にwp_generate_tag_cloud関数を使用して、変更されたタグクラウドを出力します。

ダメでした。そんなに簡単には行かないか。では次に行きます。今度は単刀直入に文章のみでお願いしてみました。

WordPress用に、タグクラウドを300個まで出力するfunctionを作成してください。

以下のように、WordPress用の関数を作成してタグクラウドを最大300個まで出力することができます。

function custom_wp_tag_cloud($args) {
  $args['number'] = 300;
  return $args;
}
add_filter('widget_tag_cloud_args', 'custom_wp_tag_cloud');

このコードでは、custom_wp_tag_cloudという新しい関数を作成し、$argsを受け取ります。$argsはタグクラウドの表示に関するパラメータを保持する連想配列です。関数の中で$args[‘number’]を300に設定することで、最大数を300個に制限しています。
最後に、add_filter関数を使用してwidget_tag_cloud_argsフィルターフックにcustom_wp_tag_cloud関数を追加します。これにより、タグクラウドが表示される際にフィルターが適用され、最大数が300個に制限されます。
この関数をWordPressのテーマのfunctions.phpファイルやカスタムプラグインに追加することで、タグクラウドが最大300個まで表示されるようになります。

ダメである。現在使用中のコードのみを提示して、それを改変するように頼んでみます。

下記のコードを、タグクラウドの出力数を300個まで許容するように改造してください。

function ex_wp_tag_cloud( $tags ) {
  $match = array(
      "/ class='tag-link-(\d+)'/i",                          //クラス、除去しないならこの行を削除
      "/ title='([^']+)'/i",                                 //マウスホバーで表示されるタイトル、除去しないならこの行を削除
      "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",    //文字サイズ
  );
  return preg_replace( $match, '',  $tags );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

以下のように、ex_wp_tag_cloud関数を改造してタグクラウドの出力数を最大300個まで許容するようにします。

function ex_wp_tag_cloud( $tags ) {
  $tags = preg_replace( "/ class='tag-link-(\d+)'/i", '', $tags );                         // クラス、除去しないならこの行を削除
  $tags = preg_replace( "/ title='([^']+)'/i", '', $tags );                                // マウスホバーで表示されるタイトル、除去しないならこの行を削除
  $tags = preg_replace( "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i", '', $tags );   // 文字サイズ

  // タグクラウドの出力数を最大300個に設定
  $args = array(
    'number' => 300,
  );

  return wp_generate_tag_cloud( $tags, $args );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

改造後のコードでは、preg_replace関数を使用してタグクラウドのクラス、タイトル、文字サイズの部分を除去します(コメント行を削除すると、その要素が保持されます)。また、$args配列を使用して出力数を最大300個に設定します。

この改造を適用するためには、WordPressのテーマのfunctions.phpファイルやカスタムプラグインに上記のコードを追加します。これにより、タグクラウドが表示される際にフィルターが適用され、出力数が最大300個に制限されます。

ダメだったので、上で提供してくれたコードをそのままコピペして返してみます。

下記のコードを実行すると、タグクラウドの値が出力されません。何が原因でしょう?

function ex_wp_tag_cloud( $tags ) {
  $tags = preg_replace( "/ class='tag-link-(\d+)'/i", '', $tags );                         // クラス、除去しないならこの行を削除
  $tags = preg_replace( "/ title='([^']+)'/i", '', $tags );                                // マウスホバーで表示されるタイトル、除去しないならこの行を削除
  $tags = preg_replace( "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i", '', $tags );   // 文字サイズ
  
  // タグクラウドの出力数を最大300個に設定
  $args = array(
    'number' => 300,
  );

  return wp_generate_tag_cloud( $tags, $args );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、wp_generate_tag_cloud関数が正常に動作するためには、$tags変数にタグの配列が渡される必要があります。しかし、現在のコードでは$tagsにはタグのHTMLが含まれています。
wp_generate_tag_cloud関数には、タグの配列を渡す必要があります。そのため、次のように改良することで、正しい結果が得られるはずです。

function ex_wp_tag_cloud( $tags ) {
  $tags_array = array();
  
  foreach ( $tags as $tag ) {
    preg_match( "/<a([^>]*)>(.*?)<\/a>/i", $tag, $matches );
    if ( isset( $matches[2] ) ) {
      $tags_array[] = $matches[2];
    }
  }
  
  $args = array(
    'number' => 300,
  );

  return wp_generate_tag_cloud( $tags_array, $args );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

この改良版では、$tags_arrayという新しい配列を作成し、正規表現を使用して各タグのテキストを抽出しています。その後、$tags_arrayをwp_generate_tag_cloud関数に渡すことで、タグクラウドが正しく出力されます。
上記の改良版のコードを使用してみてください。タグクラウドが正常に出力されるはずです。

うーーん、ダメですね。ちょっと行き詰まってきたので、事前に質問を翻訳しておいてから、英語で問うてみる。

Add an element to the following code to raise the number of tag cloud outputs to 300.

function ex_wp_tag_cloud( $tags ) {
  $match = array(
      "/ class='tag-link-(\d+)'/i",     
      "/ title='([^']+)'/i",      
      "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",
    );
  return preg_replace( $match, '',  $tags );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

To raise the number of tag cloud outputs to 300 in the given code, you need to add an additional element to the $args array. Modify the code as follows:

function ex_wp_tag_cloud( $tags ) {
  $match = array(
      "/ class='tag-link-(\d+)'/i",     
      "/ title='([^']+)'/i",      
      "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",
    );
  $tags = preg_replace( $match, '',  $tags );

  $args = array(
    'number' => 300,
  );
  
  return wp_generate_tag_cloud( $tags, $args );
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

In this code, after performing the replacements on the $tags variable using preg_replace, an additional element ‘number’ => 300 is added to the $args array. This specifies that the maximum number of tag cloud outputs should be set to 300.

By adding this element to the $args array, the wp_generate_tag_cloud function will generate the tag cloud with a maximum of 300 tags.

Please use this modified code to raise the number of tag cloud outputs to 300.

英語に切り替えても回答の内容には変化がありません。脳みそがぼんやりしてきました。ちょっと脇に逸れて、上で提示されたコード内に使われている関数について質問してみます。日常でよくみられる話題の横滑り、雑談とも言う。

preg_replace はどういうコマンドですか?

preg_replaceは、正規表現に基づいて文字列の置換を行うPHPの関数です。正式な名前は「Perl 互換の正規表現による検索と置換」と言います。
preg_replace関数は、指定した正規表現パターンにマッチする部分を検索し、指定した置換文字列に置き換えます。基本的な構文は以下の通りです。

preg_replace( $pattern, $replacement, $subject );

・$patternは正規表現のパターンを表す文字列です。検索する際の基準となるパターンを指定します。
・$replacementは置換文字列です。マッチした部分を置換するための文字列です。
・$subjectは対象となる文字列です。検索と置換の対象となる文字列を指定します。

preg_replace関数は、指定された正規表現パターンに一致する部分を全て置換します。複数のパターンを指定する場合は配列として渡すこともできます。
例えば、次のコードでは、文字列内のすべての数字を「#」に置換します。

$text = "123 abc 456 xyz";
$pattern = "/\d+/"; // 数字にマッチするパターン
$replacement = "#";
$result = preg_replace( $pattern, $replacement, $text );
echo $result; // 出力結果: ### abc ### xyz

このように、preg_replace関数は正規表現を使用して文字列の一部を置換する際に便利な関数です。

賢者に教えを乞い、新しい学びを得た歓びに押され、さらに別の関数についても聞いてみました。

wp_generate_tag_cloud とはどんな関数ですか?

wp_generate_tag_cloudは、WordPressのタグクラウド(Tag Cloud)を生成するための関数です。タグクラウドは、サイト内のタグ(キーワードやカテゴリ)の頻度や重要度を視覚的に表示するためのインタフェースです。
wp_generate_tag_cloud関数の基本的な構文は以下の通りです。

wp_generate_tag_cloud( $tags, $args );

$tagsはタグの配列です。各タグはテキストの形式で表されます。
$argsはタグクラウドの生成に関するパラメータを保持する連想配列です。オプションです。
wp_generate_tag_cloud関数は、指定されたタグの配列を使用してタグクラウドのHTMLを生成します。タグの頻度に応じて、タグのテキストやリンクのスタイルが異なる大きさで表示されます。頻度が高いタグほど大きく表示され、頻度が低いタグは小さく表示される場合があります。

$args配列には、タグクラウドの生成方法に関するさまざまなオプションを指定することができます。例えば、最大表示数やフォントサイズの範囲などの設定をカスタマイズすることができます。
wp_generate_tag_cloud関数は、テンプレートファイルやWordPressのウィジェットエリアなど、タグクラウドを表示するためのさまざまな場所で使用されます。タグクラウドをカスタマイズしたい場合には、この関数を使用して生成することができます。

雑談タイムを終了しました。問答を再開します。用意したコードは先に提示されたものです。

下記のコードを実行させると、真っ白になってしまいます。
原因は何でしょうか?

function ex_wp_tag_cloud( $tags ) {
  $match = array(
      "/ class='tag-link-(\d+)'/i",     
      "/ title='([^']+)'/i",      
      "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",
    );
  $tags = preg_replace( $match, '',  $tags );

  $args = array(
    'number' => 300,
  );
  
  return wp_generate_tag_cloud( $tags, $args );
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードが真っ白になってしまう原因は、preg_replace関数によるタグの置換処理にあります。

preg_replace関数は、指定した正規表現パターンにマッチする部分を置換しますが、現在のコードでは$tags変数にはHTMLタグの文字列が含まれています。preg_replace関数にHTMLタグを直接渡すと、正規表現のパターンが一致しないため、置換処理が行われずに結果が空白になってしまいます。

wp_tag_cloudフィルターで使用されるex_wp_tag_cloud関数は、タグクラウドのHTMLタグに対して置換処理を行う必要がありません。したがって、preg_replace関数を使用する必要はありません。

修正するには、ex_wp_tag_cloud関数を次のように変更します。

function ex_wp_tag_cloud( $tags ) {
  $args = array(
    'number' => 300,
  );
  
  return wp_generate_tag_cloud( $tags, $args );
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

この修正により、タグクラウドのHTMLタグに対して不要な置換処理が行われずに、タグクラウドが正常に表示されるはずです。
修正後のコードを使用してみてください。タグクラウドが正常に表示されるはずです。

ダメだったので、同じコードを再度提示します。

下記のコードを実行させると、エラーを起こしてしまいます。
原因は何でしょうか?

function ex_wp_tag_cloud( $tags ) {
  $match = array(
      "/ class='tag-link-(\d+)'/i",     
      "/ title='([^']+)'/i",      
      "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",
    );
  $tags = preg_replace( $match, '',  $tags );

  $args = array(
    'number' => 300,
  );
  
  return wp_generate_tag_cloud( $tags, $args );
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードがエラーを引き起こす原因は、wp_generate_tag_cloud関数の引数 $tags に渡されるデータの形式にあります。

wp_generate_tag_cloud関数は、タグの配列を受け取る必要がありますが、現在のコードでは $tags を一度正規表現によって加工しています。正規表現の置換処理によってタグの文字列から不要な属性やスタイルを削除しているため、wp_generate_tag_cloud関数が期待する形式にはなっていません。

修正するには、wp_generate_tag_cloud関数に渡す前の $tags 変数を加工する必要はありません。ex_wp_tag_cloud関数内の正規表現置換処理を削除し、次のように修正します。

function ex_wp_tag_cloud( $tags ) {
  $args = array(
    'number' => 300,
  );
  
  return wp_generate_tag_cloud( $tags, $args );
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

この修正により、タグクラウドが正常に生成されるはずです。
修正後のコードを使用してみてください。エラーが解消され、タグクラウドが正常に表示されるはずです。

ダメですね。堂々巡りです。解決の突破口が見つかりません。ここで言う突破口とは「ChatGPTが正しい回答を示すための誘導の仕方」ですが。
そこで何を思ったのか、僕はこんな指示を与えてみました。一体その時に、何故「wp_parse_argsを使え」と考えたのか今では全く思い出せません。

追記:2024/4/27
おそらく、会話が脱線している最中に、そこで出てきたキーワードをブラウザの別窓でググって、使えそうなコマンドを探していたのではないか?そこでたまたま目に留まったのが「wp_parse_args」だった…という事かもしれません

先のコードを、wp_parse_args を使って書き直してください。

次のコードは、wp_parse_args関数を使用してタグクラウドの出力数を300個に設定するように書き直したものです。

function ex_wp_tag_cloud( $tags ) {
  $args = wp_parse_args( $tags, array(
    'number' => 300,
  ) );

  return wp_generate_tag_cloud( '', $args );
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、wp_parse_args関数を使用して$tagsとarray(‘number’ => 300)をマージしています。wp_parse_args関数は、デフォルトの引数値を持つ連想配列を作成するために使用されます。$tagsが既に設定されている場合は、その値が優先されます。そうでない場合は、デフォルトの値が使用されます。

修正後のコードを使用してみてください。タグクラウドが正常に生成され、出力数が300個に設定されるはずです。

ダメだったので、さらに揺さぶりを掛けてみます。

wp_generate_tag_cloud を使わずに書き直せますか?

もちろんです。以下のコードは、wp_generate_tag_cloudを使用せずにタグクラウドを生成する方法を示しています。

function ex_wp_tag_cloud( $tags ) {
  $args = wp_parse_args( $tags, array(
    'number' => 300,
  ) );

  $tag_cloud = '';
  $tags = get_terms( 'post_tag', $args );

  if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
    $min_count = min( $tags );
    $max_count = max( $tags );

    $tag_base = get_option( 'tag_base' );

    foreach ( $tags as $tag ) {
      $tag_link = get_term_link( $tag );

      if ( is_wp_error( $tag_link ) ) {
        continue;
      }

      $count = $tag->count;
      $tag_name = $tag->name;
      $tag_link_title = sprintf( __( 'View all posts tagged with %s' ), esc_attr( $tag_name ) );

      $tag_cloud .= "<a href='{$tag_link}' title='{$tag_link_title}'>{$tag_name}</a>";
    }

    $tag_cloud = wp_generate_tag_cloud( $tag_cloud );
  }

  return $tag_cloud;
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、get_terms関数を使用してタグのリストを取得し、それぞれのタグに対してリンクを生成しています。その後、wp_generate_tag_cloudを使用してタグクラウドのスタイルを適用しています。
修正後のコードを使用してみてください。タグクラウドが正常に生成され、出力数が300個に設定されるはずです。

面白いことに、これまでとは構造の異なるコードが示されました。しかし残念ながらフッターのタグクラウドの場所は真っ白になります。
さて、ここでまたしても、その時僕は一体何を思ったのか、一番最初に質問した際のコード(A、B)を再度用意し、目的地点は同じなんだけれども、問いかけ方を少し変更してみました。

下記のサンプルを参考にして、修正依頼コードでタグを300個まで出力できるように改造してください。
【サンプル】

function my_tag_cloud_number_filter($args) {
	$myargs = array(
		'number' => 300,
	);
	$args = wp_parse_args($args, $myargs);
	return $args;
}
add_filter('widget_tag_cloud_args', 'my_tag_cloud_number_filter');

【修正依頼コード】

function ex_wp_tag_cloud( $tags ) {
  $match = array(
      "/ class='tag-link-(\d+)'/i",
      "/ title='([^']+)'/i",
      "/ style='font-size: \d+(\.)*\d*(pt|px|em|\%);'/i",
  );
  return preg_replace( $match, '',  $tags );
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

以下のコードは、my_tag_cloud_number_filter関数のロジックを修正依頼コードに統合して、タグクラウドを300個まで出力するように改造したものです。

function ex_wp_tag_cloud( $tags ) {
  $args = wp_parse_args( $tags, array(
    'number' => 300,
  ) );

  $tag_cloud = '';
  $tags = get_terms( 'post_tag', $args );

  if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
    $min_count = min( $tags );
    $max_count = max( $tags );

    foreach ( $tags as $tag ) {
      $tag_link = get_term_link( $tag );

      if ( is_wp_error( $tag_link ) ) {
        continue;
      }

      $count = $tag->count;
      $tag_name = $tag->name;
      $tag_link_title = sprintf( __( 'View all posts tagged with %s' ), esc_attr( $tag_name ) );

      $tag_cloud .= "<a href='{$tag_link}' title='{$tag_link_title}'>{$tag_name}</a>";
    }
  }

  return $tag_cloud;
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、my_tag_cloud_number_filter関数内で使用されていたwp_parse_args関数を、修正依頼コードのex_wp_tag_cloud関数内に統合しました。また、タグクラウドの生成部分はwp_generate_tag_cloudではなく、タグのリストをループして手動で生成するように変更しました。

修正後のコードを使用してみてください。タグクラウドが正常に生成され、出力数が300個に設定されるはずです。

今回、回答されたコードは、その前の回答を踏襲した改変版のように見えます。そしてこれが動作しました。一番最初の質問時点で、今回と同様の文章で問い掛ければ正解を一発で出していたのか、それとも直近で交わされた前回の会話の文脈を受けて、さらにそこへ問い掛けの文言を調整したことも微妙に影響して正解が出てきたのか、そこのところは判断できません。

うまく動作しました。ありがとう。
回答してくれたコードはちょっと長すぎる感じです。
もっとシンプルにまとめることは可能ですか?

もちろんです。以下のコードは、よりシンプルな形でタグクラウドを300個まで出力するように改造したものです。

function ex_wp_tag_cloud( $tags ) {
  $args = wp_parse_args( $tags, array(
    'number' => 300,
  ) );

  $tags = get_terms( 'post_tag', $args );

  if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
    $tag_cloud = '';
    foreach ( $tags as $tag ) {
      $tag_link = get_term_link( $tag );

      if ( is_wp_error( $tag_link ) ) {
        continue;
      }

      $tag_cloud .= '<a href="' . $tag_link . '">' . $tag->name . '</a>';
    }

    return $tag_cloud;
  }

  return $tags; // タグが存在しない場合は元のタグ一覧を返す
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、get_terms関数を使用してタグのリストを取得し、ループを使用して各タグのリンクを生成しています。タグクラウドが正常に生成された場合は、生成されたタグクラウドのHTMLを返します。タグが存在しない場合は、元のタグ一覧をそのまま返します。
修正後のコードを使用してみてください。タグクラウドが正常に生成され、出力数が300個に設定されるはずです。

うまく動作しました。
さらに行数を少なくしたいです。
シンプルにまとめることは可能でしょうか?

もちろんです。以下のコードは、さらに行数を少なくしたシンプルな形でタグクラウドを300個まで出力するように改造したものです。

function ex_wp_tag_cloud( $tags ) {
  $args = wp_parse_args( $tags, array(
    'number' => 300,
  ) );

  $tags = get_terms( 'post_tag', $args );

  if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) {
    $tag_cloud = '';
    foreach ( $tags as $tag ) {
      $tag_link = get_term_link( $tag );
      if ( ! is_wp_error( $tag_link ) ) {
        $tag_cloud .= '<a href="' . $tag_link . '">' . $tag->name . '</a>';
      }
    }
    return $tag_cloud;
  }

  return $tags;
}

add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、前回のコードと同様にget_terms関数を使用してタグのリストを取得し、ループ内でタグのリンクを生成しています。is_wp_error関数を使用して、タグリンクがエラーでないことを確認してからタグクラウドに追加します。
修正後のコードを使用してみてください。タグクラウドが正常に生成され、出力数が300個に設定されるはずです。行数も最小限に抑えられています。

問題なく動作しました。
さらにシンプルに改造して、行数を減らすことは可能ですか?
難しいかな??

もちろんです!以下のコードは、行数をさらに減らしてよりシンプルな形でタグクラウドを300個まで出力するように改造したものです。

function ex_wp_tag_cloud( $tags ) {
  $args = wp_parse_args( $tags, array( 'number' => 300 ) );
  $tags = get_terms( 'post_tag', $args );
  return ! empty( $tags ) && ! is_wp_error( $tags ) ? implode( '', array_map( function( $tag ) { return "<a href='" . get_term_link( $tag ) . "'>" . $tag->name . "</a>"; }, $tags ) ) : $tags;
}
add_filter( 'wp_tag_cloud', 'ex_wp_tag_cloud' );

このコードでは、array_mapを使用してタグのリストをループ処理し、各タグのリンクを生成します。最後にimplodeを使用してタグクラウドのHTMLを結合し、結果を返します。タグが存在しない場合やエラーが発生した場合は、元のタグ一覧をそのまま返します。

修正後のコードを使用してみてください。タグクラウドが正常に生成され、出力数が300個に設定されるはずです。さらに行数が減り、コードがよりシンプルになりました。

可読性は無視して(いや、最初から全く理解してないけれど)行数を減らすことを優先し、ChatGPTがまとめてくれた上記の最後のコードを現在、このブログでは使用しています。

ぼんやり考えた…マシン相手でも「会話」という行為はそこそこ楽しい

まず「正しく質問しなければならない」と言うのは人も動物もマシンも変わらないけれど、スタート地点に立つための「正しい問い」に辿り着くまでが大変なのは、この先もしばらく変わらないような気がします。今回のやり取りでは実際に被る損害は生じないし、時間の損失も問題にならない状況だったことが幸いして、雑談を介した会話の揺らぎが功を奏した気がします。会話のやり取りが記録されている過去ログの流れを眺めていて「なぜそこでそう思いついた?」と言うのが理路として全く説明不可で、文字通りの揺らぎでしかない。他者と何気なく交わす会話、雑談は重要です。

ただ難点としては、今回舞い降りてきた閃きのようなものに対し、そこに至る過程の解釈も、得られた回答の中身に関する理解も、未だ全く自分の中で行われていないという事です。つまり1センチも成長していない。

1センチも成長していない…。思い出されたのはあの地獄のような暑さだけ。