質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3399閲覧

特定のテーマだけカスタム投稿タイプのページが表示できない

bokupiroki

総合スコア54

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/06/22 08:51

編集2024/03/06 10:57

前提・実現したいこと

カスタム投稿タイプでページを作成したいです。
しかし、アクセスするとエラーが出てページの内容を表示できません。

この症状は「the thor」という特定のテーマだけで起こります。

発生している問題・エラーメッセージ

作成したカスタム投稿のURLにアクセスするとエラーが出ます。

Fatal error: Cannot redeclare current_crumb_tag() (previously declared in /home/www/fuga/wp-content/themes/the-thor/inc/front/breadcrumb.php:22) in /home/www/fuga/wp-content/themes/the-thor/inc/front/breadcrumb.php on line 22

該当のソースコード

子テーマのfunctions.phpに下記のコードを追加してカスタム投稿タイプの追加を行いました。

php

1function create_post_type() { 2 $exampleSupports = [ // supports のパラメータを設定する配列(初期値だと title と editor のみ投稿画面で使える) 3 'title', // 記事タイトル 4 'editor', // 記事本文 5 'thumbnail', // アイキャッチ画像 6 'revisions' // リビジョン 7 ]; 8 register_post_type( 'example', // カスタム投稿名 9 array( 10 'label' => 'テストカスタム投稿', // 管理画面の左メニューに表示されるテキスト 11 'public' => true, // 投稿タイプをパブリックにするか否か 12 'has_archive' => true, // アーカイブを有効にするか否か 13 'menu_position' => 5, // 管理画面上でどこに配置するか今回の場合は「投稿」の下に配置 14 'supports' => $exampleSupports // 投稿画面でどのmoduleを使うか的な設定 15 ) 16 ); 17} 18add_action( 'init', 'create_post_type' ); // アクションに上記関数をフックします

試したこと

・エラー内容について
該当ページに「Cannot redeclare current_crumb_tag()」というエラーがあることから、関数の重複を疑いました。
しかし、functions.phpに追記した関数名の「create_post_type」を別の文字に置き換えても結果は同じでした。

breadcrumb.php全体のコードは文字数オーバーになるので
ここには記載できませんでした。

###追加で試したこと1
hayato7様の回答をもとに、
親テーマの該当関数が定義されているファイルに
「if ( function_exists( 'current_crumb_tag' )」
のようなif文を追記しました。

php

1//breadcrumb.php 2 3//中略 4 5 6 if ( function_exists( 'current_crumb_tag' ) ) { 7 function current_crumb_tag( $current_permalink, $current_text = '', $args = array(), $current_class = 'breadcrumb__item breadcrumb__item-current' ) { 8 $args = wp_parse_args( $args ); 9 $args = ( object )$args; 10 $current_class = $current_class ? ' class="' . esc_attr( $current_class ) . '"': ''; 11 $start_anchor_tag = $current_permalink ? '<a href="' . $current_permalink . '">': ''; 12 $end_anchor_tag = $current_permalink ? '</a>' : ''; 13 $current_before = '<li' . $current_class . '>' . $start_anchor_tag . ''; 14 $current_crumb_tag = $current_text; 15 $current_after = '' . $end_anchor_tag . '</li>'; 16 if ( get_query_var( 'paged' ) ) { 17 if ( is_paged() || is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) { 18 $current_after = ' (ページ' . get_query_var( 'paged' ) . ')' . $current_after; 19 } 20 21 } elseif ( ( is_page() || is_single() ) && get_query_var( 'page' ) ) { 22 $current_after = ' (ページ' . get_query_var( 'page' ) . ')' . $current_after; 23 } 24 25 return $current_before . $current_crumb_tag . $current_after; 26 } 27 } 28 29//中略 30 31//元から書いてあっためちゃくちゃ長いif文の途中 32 } else { 33 $post_type_object = get_post_type_object( get_post_type() ); 34 $breadcrumb_html .= '<li' . $li_class . '><a href="' . get_post_type_archive_link( get_post_type() ) . '">' . $post_type_object->label . '</a></li>'; 35 $taxonomies = get_object_taxonomies( get_post_type() ); 36 $category_term = ''; 37 38 foreach ( $taxonomies as $taxonomy ) { 39 $taxonomy_obj = get_taxonomy( $taxonomy ); 40 if ( true == $taxonomy_obj->hierarchical ) { 41 $category_term = $taxonomy_obj; 42 break; 43 } 44 } 45 46 if ( $category_term ) { 47 $terms = get_the_terms( $post->ID, $category_term->name ); 48 49 if ( $terms ) { 50 if ( !$terms || is_wp_error( $terms ) ) 51 $terms = array(); 52 53 $terms = array_values( $terms ); 54 $term = $terms[ 0 ]; 55 56 if ( $term->parent != 0 ) { 57 $ancestors = array_reverse( get_ancestors( $term->term_id, $term->taxonomy ) ); 58 foreach ( $ancestors as $ancestor ) { 59 $breadcrumb_html .= '<li' . $li_class . '><a href="' . get_term_link( $ancestor, $term->taxonomy ) . '">' . get_term( $ancestor, $term->taxonomy )->name . '</a></li>'; 60 } 61 } 62 //156行目↓↓ 63 $breadcrumb_html .= '<li' . $li_class . '><a href="' . get_term_link( $term, $term->taxonomy ) . '">' . $term->name . '</a></li>'; 64 } 65 } 66 67 $breadcrumb_html .= current_crumb_tag( get_the_permalink( $single->ID ), get_the_title( $single->ID ) ); 68 } 69//中略

「breadcrumb.php on line 156」と末尾にあることから今度は同じファイルの156行目付近に何かあるのか探してみましたが、よくわかりませんでした。(上記に周辺コードも載せています)

関数名を定義する部分だけでなく、途中に登場する「$current_crumb_tag」にも何か処理を加えないといけないのでしょうか

補足情報(FW/ツールのバージョンなど)

・WordPress5.4.2
・PHP 7.3.18
・プラグインはすべて停止状態

有料テーマなのでサポートにも問い合わせていますが、回答が得られていない状態です・・・

どなたか知恵を貸していただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

The ThorにプラグインYada Wikiインストールでエラーと同じような現象が起きているのではないかと思います。

既存のプラグインなどで、すでにcurrent_crumb_tag()関数が定義されており、
「the thor」というテーマのみ、「Fatal error: Cannot redeclare(同じ関数名を再度宣言できない)」というエラーがでているのではないでしょうか。

対処法としましては、リンク先と同じ親テーマ内の、関数に条件分岐をつける。

php

1~~if ( function_exists( 'current_crumb_tag' ) ) {~~//こちらミスです。 2if ( !function_exists( 'current_crumb_tag' ) ) { 3 function current_crumb_tag() { 4     ..中略.. 5}

あるいは、もう一つの関数がどこかにあるはずなので、それに条件分岐をつける(必要のないプラグインなどであれば削除する )ことで、修正できると思います。(テーマ公式が修正入れてくれるのが一番良いのですが、それまでは自分で修正をいれておくのがいいのかなと思います。)

投稿2020/06/22 10:40

編集2020/06/22 12:27
hayato7

総合スコア1135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bokupiroki

2020/06/22 11:16

ありがとうございます。 また別のエラーが出てしまいました。 試した結果の詳細を「追加で試したこと1」として追記したのでご確認いただきたいです。 また、プラグインは停止していても削除しなければぶつかることがあるものなのでしょうか。
hayato7

2020/06/22 12:25

プラグインは、停止していれば問題ないと思います。 すみません、私の回答が原因でした!! if( !function_exists( 'current_crumb_tag' ) ) { なければと条件つけないといけなかったです。 本当に申し訳ないです!!
bokupiroki

2020/06/22 12:26

ありがとうございます! 後ほど試して結果を報告します。
bokupiroki

2020/06/22 15:24

できました! 子テーマの階層に inc/front/breadcrumb.php を作成してもうまくいったので、テーマ更新時に書き戻されることも回避できそうです。 なぜかカスタム投稿タイプだけパンくずが二重に表示されますが、その辺はうまいことやります。 ありがとうございました。
hayato7

2020/06/22 15:39

コードを間違えてしまい、本当に申し訳ありませんでした。回避できたようでよかったです!! > パンくずが二重に表示 同じ質問があって、解決していないようなので、もし解決できたら解決策を書くのもいいかもしれません。 https://teratail.com/questions/271566
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問