🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

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

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

1742閲覧

WordPress 複数のカスタム投稿タイプごとにデフォルトで選択するタームを指定したい

shimon11

総合スコア50

WordPress

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

PHP

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/03/08 07:41

前提・実現したいこと

複数のカスタム投稿タイプごとにデフォルトで選択するタームを指定したいです

以下のコードを参考にしました
WordPress でデフォルトのカスタム分類のタームを自動で指定する

下記のように3つのカスタム投稿タイプがある場合どのように関数を繰り返せばよろしいでしょうか?

ソースココード

PHP

1$array = [ 2 array( 3 'taxonomy' => 'taxonomy-1', 4 'default_term' => 'term1', 5 'default_term_id' => 1, 6 ), 7 array( 8 'taxonomy' => 'taxonomy-2', 9 'default_term' => 'term3', 10 'default_term_id' => 2, 11 ), 12 array( 13 'taxonomy' => 'taxonomy-3', 14 'default_term' => 'term3', 15 'default_term_id' => 3, 16 ), 17]; 18foreach ($array as $value){ 19 // カスタム投稿タイプでカテゴリ未選択時にデフォルトで default_term を設定 20 function add_default_term_automatically($post_ID) { 21 global $wpdb; 22 // 設定されているカスタム分類のタームを取得 23 $curTerm = wp_get_object_terms($post_ID, $value['taxonomy'].'_cat'); 24 if (0 == count($curTerm)) { 25 // default_term のターム ID 26 $defaultTerm= array($value['default_term_id']); 27 wp_set_object_terms($post_ID, $defaultTerm, $value['taxonomy'].'_cat'); 28 } 29 } 30 add_action('publish_'.$value['taxonomy'].'', 'add_default_term_automatically'); 31}

###エラーメッセージ
上記のコードでは関数が複数選択されるようなエラーが返ってきます

Fatal error: Cannot redeclare add_default_term_automatically()

繰り返し同じような関数とactionを繰り返す方法を教えていただきたいです

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

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

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

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

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

guest

回答1

0

foreachで繰り返し同じ関数名を宣言しているからエラーを吐いていると思われるので、
関数内で分岐処理してやるか、もしくは関数名を少しずつ変えれば良いんじゃないかなぁ。

投稿2021/03/08 11:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shimon11

2021/03/09 00:21 編集

回答ありがとうございます! 確かに分岐を増やせば解決するのですがコードが長くなるのが不格好なのでなんとかしたいです。 質門上では3つのカスタム投稿タイプですが実際は10以上投稿タイプがあるため繰り返しをしないと長くなってしまします
退会済みユーザー

退会済みユーザー

2021/03/09 01:01 編集

関数名に変数使えないかなぁとか調べ捲ったけど見当たらずでした。 というかそもそも論なんですが… この関数内で投稿データをもとに配列を参照し、 タクソノミーに対するタームの値を返すのだから、 配列だけを10個に増やせばよくて、 「判定のアルゴリズムであるこの関数を複数にしてあげる必要性」 これはもともとないのでは?と思いました。 ループ回したい理由がなにかあるのかと思ったんですが、たぶんないですよね? わざわざ配列をforeachでループさせずに、投稿からタクソノミーを引っ張って、 配列を参照してタームと紐づけ、タームの値を返す関数…と組みかえれば1つの関数で行けるかと。 ※組み替える=>foreach使わずに組む
shimon11

2021/03/09 01:30 編集

ご返信ありがとうございます! 確かに関数内で投稿タイプを分岐させて返す関数は一つで済みます しかし投稿タイプごとにactionが必要になりここは一度に処理出来ないでしょうか? add_action('publish_'.$value['taxonomy'].'', 'add_default_term_automatically'); {$new_status}_{$post->post_type} | Hook | WordPress Developer Resources https://developer.wordpress.org/reference/hooks/new_status_post-post_type/
退会済みユーザー

退会済みユーザー

2021/03/09 01:53

投稿画面をフックに選ぶものが用意されてそうな気がしたので調べてみました。 僕は使ったことが無いのだけど、 `edit_form_top` >フォームの内部で、WordPress 投稿編集画面 (およびカスタム投稿タイプ) のタイトルの前、かつ、最初の隠しフィールド (user_ID、アクション 等) の後で実行する。 このようなものがありました。 他にもedit系があるみたいなので参考URLをご覧いただき、 しっくりくるものを選ばれると良いかと思います。 参考URL WordPress Codex 日本語版 プラグイン API/アクションフック一覧 https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問