2

データベースから値をフェッチする次の変数があります。これらの変数は、階層リスト (形式) の親の値と同じ階層リストの子の値を格納しています。

$getSolos = $wpdb->get_results($wpdb->prepare("
        SELECT * FROM wp_terms p 
        LEFT OUTER JOIN wp_term_taxonomy t ON p.term_id = t.term_id
        WHERE t.taxonomy = 'format'
        AND t.parent = 0
        AND t.term_id NOT IN (SELECT parent FROM wp_term_taxonomy WHERE taxonomy = 'format' AND parent > 0)
        ORDER BY t.parent
        "));

$getParents = $wpdb->get_results($wpdb->prepare("
        SELECT * FROM wp_terms p 
        LEFT OUTER JOIN wp_term_taxonomy t ON p.term_id = t.term_id
        WHERE t.taxonomy = 'format'
        AND t.parent = 0
        AND t.term_id IN (SELECT parent FROM wp_term_taxonomy WHERE taxonomy = 'format' AND parent > 0)
        "));

上記は必ずしも重要ではありませんが、私のデータベースは次のようになっています。

term_id name          slug                   term_id1    parent
1         Entry Form    entry-form           1           0
2         Facebook      facebook             2           0
3         Entry Form    entry-form-facebook  3           2
4         Twitter       twitter              4           0
5         Page          page-facebook        5           2

論理的には、私の OBJECT ARRAYS には以下が含まれます。

$getParents->parent = 2 // contains only IDs of parent formats
$getSolos->term_id = 1,5 // contains only IDs of formats that have no children

アイデアは、ドロップダウン フォーム メニューにこれらのフォーマットを入力することです。親フォーマットは、その子を含む optgroup です。これまでのところ、次のことを達成しました。

<form>
    Format: <select name="format">
        <option value="empty"></option>
            <?php 
                foreach ($getSolos as $solo) {
                    echo "<option value='".$solo->name."' ".$selected.">".$indent.$solo->name."</option>";
                }
                foreach ($getParents as $parent) {
                    echo "<optgroup label='".$parent->name."'>";
                    // How do I get the children in here?
                    echo "</optgroup>";
                }
            ?>
    </select>
</form>

上記の出力:

Entry Form
Twitter
Facebook // Bold as it is an optgroup header

出力は次のようになります。

Entry Form
Twitter
Facebook // Bold as it is an optgroup header
    Entry Form
    Page

ここに私の質問があります: 1) 親の optgroup 内に子を表示するにはどうすればよいですか?

4

1 に答える 1

1

PHP で適切なNOT IN条件を作成し、それを MySQL に渡すことができます。たとえば、次のようになります。

$parents_sql = implode(',', array_map(intval, $getParents->parent));

$getSolos = $wpdb->get_results($wpdb->prepare("
    SELECT term_id FROM wp_term_taxonomy            
    WHERE taxonomy = 'format'           
    AND parent = 0 AND term_id NOT IN ($parents_sql)
    "));

(注:intvalは、このコードが SQL インジェクションを引き起こさないことを確認するためにあります。あなたの場合、それは問題にはならないはずですが、確信が持てないことはありません。いずれにせよ、それは良い習慣です。これを文字列キーで行っていた場合は、データベースに適した文字列引用関数に置き換えることができます。)

ただし、親レコードが多数ある場合は、サブクエリを使用する方が効率的かもしれません ( demo on SQLFiddle ):

SELECT term_id FROM wp_term_taxonomy AS t1            
WHERE taxonomy = 'format'           
AND parent = 0
AND term_id NOT IN (
    SELECT parent FROM wp_term_taxonomy         
    WHERE taxonomy = 'format'           
    AND parent > 0)

またはLEFT JOINSQLFiddle のデモ):

SELECT t1.term_id
FROM wp_term_taxonomy AS t1            
  LEFT JOIN wp_term_taxonomy AS t2
    ON t1.term_id = t2.parent
WHERE t1.taxonomy = 'format'           
  AND t1.parent = 0
  AND t2.term_id IS NULL
于 2013-01-03T01:01:20.660 に答える