ホームページ >バックエンド開発 >PHPチュートリアル >子と親は同じ商品になりますか? $term_id == $child?
get_term_children 関数内:
子と親は同じアイテムになりますか? ? ? $term_id == $child? ? ?
以下は長い間迷っていたソースコードです。アドバイスをお願いします。
/**
* すべてのタームの子を単一の ID 配列に結合します。
*
* この再帰関数は、$term のすべての子を同じ
* 用語 ID の配列にマージします。 階層的な分類法にのみ役立ちます。
*
* $term が $taxonomy に存在しない場合は、空の配列を返します。
*
* @since 2.3.0
*
* @param string $term_id 子を取得する用語の ID 。
* @param 文字列 $taxonomy 分類名。
* @return array|WP_Error 用語 ID のリスト。 「$taxonomy」が存在しない場合、WP_Error が返されます。
*/
function get_term_children( $term_id, $taxonomy ) {
if ( !taxonomy_exists($taxonomy) )
return new WP_Error('invalid_taxonomy', __('無効な分類法'));
$term_id = intval( $term_id );
$terms = _get_term_hierarchy($taxonomy);
if ( ! isset($terms[ $term_id]) )
return array();
$children = $terms[$term_id];
foreach ((array) $terms[$term_id] as $child ) {
if ( $term_id == $child ) {
continue
}
if ( isset($terms[$child]) )////子も項目の場合
$children = array_merge($children, get_term_children($child, $taxonomy));
}
return $children
}
添付ファイル:
/ **
* 分類の子を用語 ID として取得します。
* 子项仅返し term_id
* @ignore
* @since 2.3.0
*
* @param string $taxonomy Taxonomy name。
* @return array $taxonomy が階層的でない場合、または子 をTerm IDとして返す場合は空になります。
*/
function _get_term_hierarchy( $taxonomy ) {
if ( !is_taxonomy_hierarchical($taxonomy) )
return array()
$children = get_option("{$taxonomy); } _children");
if ( is_array($children) )
return $children;
$children = array();
$terms = get_terms($taxonomy, array(' get ' => 'all', 'orderby' => 'id=>parent')); $terms as $term_id => ) {
if ( $parent > 0 )
$children[$parent][] = $term_id;
}
update_option("{$taxonomy}_children", $children); 🎜 >
return $children;
返信議論へ (解決策)
get_term_children はすべてのサブカテゴリを抽出するために使用されます
パラメータ
$term_id はチェックを開始するカテゴリ ID
$taxonomy はカテゴリ名
$terms = _get_term_hierarchy($taxonomy );
名前でチェックする分類 ID セットを取得します
foreach ( (array) $terms[$term_id] as $child ) {
if ( $term_id == $child ) {
continue;
}
取得したカテゴリ ID セットを調べて、対応する操作を実行します
$term_id はカテゴリ ID であるため、カテゴリ ID セットに表示されるのが通常です
論理的に言えば、自分自身が自分の親になることはできません。あなたが上で言ったことは正しいです。ただし、データはデータベースから取得しており、ここでのデータは Web サイトのバックエンドから、または運用データベースから直接追加されたものです。 if ( $term_id == $child ) ---- このような検証は、Web サイトのバックグラウンドから挿入されたデータの場合は不要です。データベースの直接操作によって追加されたデータの場合、実用的な意味を持つ可能性があります。
この理解が包括的であるかどうかはわかりません
$terms = _get_term_hierarchy($taxonomy);
は、チェックされる分類 ID のコレクションを名前
で取得するため、次のように仮定することはできません$term_id は確実である _get_term_hierarchy($taxonomy) の結果には含まれていない
対応するのは名前と ID だけではないため、_get_term_hierarchy は依然としてあいまいクエリであることは言うまでもありません
答えは次のとおりです: function wp_insert_term ( $term, $taxonomy, $args = array( ) ) ----
分類が階層的で、'parent' 引数が空でない場合、
用語が挿入され、term_id が与えられます。 .
親引数は term_id と関連している必要はありません。
弱い質問: 平等な状況は存在するでしょうか?次のコードを見ると、これが起こる可能性があります。
foreach ( (array) $terms[$term_id] as $child ) {
if ( $term_id == $child ) {
continue; 🎜> }
どう理解すればいいのかわかりませんよね?アドバイスをお願いします。
$terms は他のチャネルから取得されるため、$terms[$term_id] に $term_id が含まれるのは通常です
彼はすでにこれを処理していますway
if ( $term_id == $child ) { //その場合は
continue // ループを続行し、他の操作は行いません
}
したがって、続行する必要はありません。心配しないでください
知りたいだけなら: どのような状況で $term_id == $child
続行する前に $terms と $taxonomy を印刷して確認してください
項目の末尾を下から反復して返す
このように理解すれば問題ありません。
再帰の 2 つの特徴: A 関数が繰り返し自分自身を呼び出す B あるは終了であり、初期化値があります
continue はフロー制御ステートメントです。
continue は、このループ内の残りのコードをスキップし、条件が true と評価されたときに次のループの実行を開始するためにループ構造で使用されます。
再帰は条件付きです: サブ項目がある場合のみ、再帰は
再帰
の場合: 条件付きエントリ (幅優先)
の場合: 条件付き戻り (深さ優先)
具体的な用途はアプリケーション シナリオに従って決定する必要があります