お問い合わせ

SWELL 階層を持つカスタムタクソノミーを使うとWarningが出る

  • URLをコピーしました!

SWELLのフォーラムでカスタムタクソノミーに関する不具合が報告されていました。

内容をかいつまむと以下のようなものです。

カスタムタクソノミに階層構造を持たせ、複数カテゴリを選択すると、記事を表示した時にWarningが出る

Warning
: Undefined array key 0 in
/home/XXXXXXXXX/example.com/public_html/example.com/test/wp-content/themes/swell/classes/Utility/Get.php
on line
805

fatalエラーではなくWarningですので、サイトが表示できなくなるようなことはありません。

Warningが出ているのは、Get.phpというファイルで親テーマのファイルです。

親テーマのファイルの場合、子テーマで修正できないので、直接親テーマを修正することになります。

そうなるとテーマアップデートで消えてしまうため、テーマのアップデートがしにくくなる問題があります。

Warningが出る問題箇所は親テーマのGet.phpファイル

Warningが出ているのは、swell/classes/Utility/Get.phpの805行目です。

その記述は、$top_act_id = $ancestors[0];です。

Warningの内容からすれば、$ancestorsが配列じゃないので添え字でアクセスできないという内容です。

		// 階層を保つ場合は親から順に並べる
		if ( is_taxonomy_hierarchical( $tax ) ) {
			$term_tree = [];
			foreach ( $terms as $term ) {
				$self_id   = $term->term_id;
				$parent_id = $term->parent;

				$term_data = [
					'id'   => $term->term_id,
					'slug' => $term->slug,
					'name' => $term->name,
					'url'  => get_term_link( $term ),
				];

				$acts_ct    = 0;
				$top_act_id = $self_id;
				if ( $parent_id ) {
					// 先祖リストを取得
					$ancestors  = array_reverse( get_ancestors( $term->term_id, 'category' ) );
					$acts_ct    = count( $ancestors );
					$top_act_id = $ancestors[0];
				}

タクソノミーが階層を持っている場合は、この処理が走るのですが、なぜ配列が返ってこないのでしょうか?

理由は単純です。

$ancestors = array_reverse( get_ancestors( $term->term_id, 'category' ) );

となっているので、階層のあるタクソノミーはcategoryに限定されているからです。

タームIDがcategoryに属しているわけではないので、$ancestorsは配列で返ってこないのです。

修正するのであれば、categoryに限定されている部分をタームIDが属するタクソノミーになるように修正してあげればよいです。

$termは、$termsのをforeachで取り出したものです。

$terms = get_the_terms( $post_id, $tax ) ?: [];

$termsはWP_Termオブジェクトの配列なので、$term->taxonomyでタクソノミー名を取得できます。

Get.phpの修正内容

修正するのであれば、以下のようになります。

$ancestors = array_reverse( get_ancestors( $term->term_id, 'category' ) );

$ancestors = array_reverse( get_ancestors( $term->term_id, $term->taxonomy ) );

		// 階層を保つ場合は親から順に並べる
		if ( is_taxonomy_hierarchical( $tax ) ) {
			$term_tree = [];
			foreach ( $terms as $term ) {
				$self_id   = $term->term_id;
				$parent_id = $term->parent;

				$term_data = [
					'id'   => $term->term_id,
					'slug' => $term->slug,
					'name' => $term->name,
					'url'  => get_term_link( $term ),
				];

				$acts_ct    = 0;
				$top_act_id = $self_id;
				if ( $parent_id ) {
					// 先祖リストを取得
					$ancestors  = array_reverse( get_ancestors( $term->term_id, $term->taxonomy ) );
					$acts_ct    = count( $ancestors );
					$top_act_id = $ancestors[0];
				}

Warningを無視、出力しないようにするには?

WordPressサイトで、Warning等を一切出力しないようにすることでも、今回の問題を抑制できます。

Warning自体は内部的に発生しているので、本質的な解決にはなりません

変更前

define( 'WP_DEBUG', false );

変更前

define('WP_DEBUG', false);
define('WP_DEBUG_LOG', false);
define('WP_DEBUG_DISPLAY',false);
@ini_set('display_errors',0);
@error_reporting(0);

まとめ

SWELLはカスタム投稿やカスタムタクソノミーへの対応が遅れています。SWELL自体がそのような利用を前提として設計されていないまま、場当たり的に修正しているのが原因だと思います。

今回の件はPHP7では問題が無いのかもしれませんが、PHP8以降では厳格なチェックが入ります。

気が付けば簡単に直せるものですが、そもそも使用の想定外となるとテストケースに入ってないので、なかなか修正されないのかもしれません。

最近はSWELLは更新頻度が落ちており、開発が停滞している感がありますので、そろそろ賞味期限切れなのかもしれません。

他の人にもシェアしてね
  • URLをコピーしました!
  • URLをコピーしました!
コメントを閉じる

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

クリックできる目次