2016-09-07 10 views
0

これを動作させる方法を試してみるために何時間も実験し、調査しましたが、私は運がまったくありません。一致するサブフィールド値を持つ特定のACFリピータ行を取得する方法

だから私はちょっと混同しなければならないいくつかのカスタムポストタイプがあります。できるだけ明確かつ経済的にそれを試してみましょう。

メッセージ&のカスタム投稿タイプが2つあります。 (これは大規模な複数の教会のウェブサイトです)。各メッセージ投稿は、(Taxonomyフィールドを介して)キャンパスに基づいていくつかのリピータ行を持ち、各Campus投稿は最新のMessage投稿を取得しようとし、特定の「キャンパス」リピータ行とその行から同じフィールド値を取得しようとします。

メッセージ単一のポストのためのACFの中継区間...、現時点ではそう enter image description here

(私たちは、その後、手動でスピーカーの名前とメッセージのURLを入力する、キャンパス柱の一つ選択している)I "キャンパス"の単一の投稿の中で、最新のメッセージ投稿を検索して取得しようとしています。しかし、それから私は、メッセージ投稿の特定のリピーター行INSIDEの値をターゲットにして取り込みしようとしています。メッセージのリピータフィールドは、キャンパスセレクト(「キャンパス」ポストタイプの「投稿オブジェクト」フィールドと2つの異なるテキストフィールドに基づいて選択します)

メッセージの投稿には、次のリピーターデータ: リピーター行1:キャンパスセレクト - トロイ(ポスト)、メッセージスピーカー - Danny Cox、メッセージURL - (URL A) リピーター行2:キャンパスセレクト - バーミンガム(ポスト)、メッセージスピーカー - クリフジョンソン、メッセージURL - (URL B) ...複数のキャンパスにはリピータが動的に配置されます

私は次のようにしています。トロイ "の例 - 私は最新のメッセージポストをつかみ、繰り返しに行く「Campus Select」値を含む行を探します。私はメッセージスピーカー(Danny Cox)とメッセージURL(URL A)をその行から返信したいと思います。私は他の行から何も必要ありません。

私は私の現在の「最新のメッセージ」とここに私の現在のクエリの中2つのリピータの行があります。トラブルシューティングのために

<?php 
    $args = array(
    'post_type' => 'messages', 
    'posts_per_page' => 1 
); 

    $latestMessageQuery = new WP_Query($args); 
    if($latestMessageQuery->have_posts()) { ?> 
    <?php while ($latestMessageQuery->have_posts()) : $latestMessageQuery->the_post(); ?> 
     <?php if(have_rows('campus_message')): ?> 
     <?php while(have_rows('campus_message')): the_row(); ?> 
      <?php if(get_sub_field('campus_selector') == 'troy'): ?> 
      <?php the_sub_field('message_speaker'); ?> 
      <?php else: ?> 
      <?php the_sub_field('message_speaker'); ?> 
      <?php endif; ?> 
     <?php endwhile; ?> 
     <?php endif; ?> 
    <?php endwhile; ?> 
    <?php } 
    wp_reset_query(); 
?> 

を、私は手動で「トロイ」の値をつかむしようとしている「キャンパスセレクタ」の代わりに、現在の「キャンパス」の場所に基づいてその値を動的に取得しています。

「Cliff Johnson Danny Cox」(2つのリピータ行があるため)

返信方法:「Troy、Danny Cox、url A」をクエリに使用しますか?

+0

私が関係しているデータの関係から、セットアップに関する問題があります。この例では、このクエリを実行する前にキャンパスの投稿名を取得してから、 '。 。 。 == 'トロイ'とそのポスト名。最後に、同じ出力を生成する対応するelseを削除します。私はしかし、いくつかの選択肢を見てみましょう。 1)異なる構造を検討するか、2)カスタムDBクエリ(https://codex.wordpress.org/Class_Reference/wpdb)を使用する –

+0

こんにちはNathan、応答ありがとう... 上記: "トラブルシューティングのために... "私は動的に投稿名を取得し、それを" ... == 'トロイ'のビットに引くことができます。私はその部分を解決することができます。 これは非常に大きなサイトであるため、構造を変更することはできないと思うし、それぞれのキャンパスごとにACFリピータを提供する単一の "メッセージ"ポストを持つことは、はるかに論理的な解決策のようだ。 ..各キャンパスに7つの異なる "メッセージ"ポストを持つよりもむしろ。 –

+0

あなたの提案によれば、カスタムDBクエリは自分のスキルレベルでは非常に複雑です。私の状況でそれがどのように機能するかの例を教えてください。 –

答えて

0

この問題でACFサポートから助けを得ました。私が送った次のコードは、私が求めていたものです。

<?php 
$args = array(
    'post_type' => 'messages', 
    'posts_per_page' => 1 
); 
$current_campus_id = get_the_ID(); 

$latestMessageQuery = new WP_Query($args); 
if($latestMessageQuery->have_posts()) { 
    while ($latestMessageQuery->have_posts()) : $latestMessageQuery->the_post(); 
     if(have_rows('campus_message')): 
      while(have_rows('campus_message')): the_row(); 
       if(get_sub_field('campus_selector') == $current_campus_id): 
        the_sub_field('message_speaker'); 
        the_sub_field('message_url'); 
        break; 
       endif; 
      endwhile; 
     endif; 
    endwhile; 
} 
wp_reset_query(); 
?> 
+0

これは動作しますが、すべての行を検索してそれらを検索する必要はありません。 –

+0

私は全くあなたに同意します。私のチームはこのプロジェクト(会社の間のいくつかの愚かな政治)を失ってしまったのですが、これに代わるもう一つの解決策があるのか​​どうか不思議です。 –

+0

片方向SQLに直接行くことです、私は通常これを行うことをお勧めします...しかし、これは将来的に安定しているはずです:)私の答えを参照してください –

0

私はグローバル$wpdbを使用して、よりSQL-直接的なソリューションを提供しています。 通常は、SQLを「直接」使用することを強くお勧めしますが、この場合、ACFフローは「通常の」メタ/カスタムフィールドとしてフィールドを格納するため、将来的にWPメタおよびACFによるメタ構造の構造は安定しているはずです。

これは、サブフィールド値によって特定される特定のACFリピータ行を取得する方法について、非常に簡単で冗長性のない方法であるため、私はこれを投稿しています。
...多くのACFリピータ行がある場合に便利です。

私はそれが最も関連性が高いと思うので、オプションフィールドグループのリピータの例を紹介します。

のは、あなたがキー/名前subfield_name持つキー/名前your_option_nameとサブフィールドとオプションのフィールドを持っていると仮定しましょう - つまり「任意の単一文字 - SQL LIKE_特殊文字
としてを使用しているので、それはだ、\はいくつかの部分でエスケープに注意「このソリューションの

$query = 
"SELECT option_name, option_value FROM {$GLOBALS['wpdb']->prefix}options" 
." WHERE option_name LIKE (" 
     ." SELECT" 
     ." CONCAT('options\_your\_option\_name\_', CAST(REPLACE(option_name, 'options_your_option_name_', '') AS INTEGER), '%')" 
     ." FROM {$GLOBALS['wpdb']->prefix}options" 
     ." WHERE" 
     ." (option_name LIKE 'options\_your\_option\_name\_%\_subfield\_name')" 
     ." AND" 
     ." (option_value = 'some subfield value')" 
     ." LIMIT 0,1" 
.")" 
    ; 

    $results = $GLOBALS['wpdb']->get_results($query, ARRAY_A); 

    if(!empty($results)){ 
    foreach($results as $result){ 
     //do something with it :) 
     echo $result['option_name'] . " => " . $result['option_value']; 
     echo "<br>"; 
    } 

    } 

主な欠点は、あなたには、いくつかのフォーマットされたフィールドを持っている場合は、手動で書式設定の世話をしなければならないということです、WYSIWYGフィールドのためにそれだけで
ようthe_contentフィルタを使用し、非常に簡単です10。

SQLノートは :それは基本的に、それはあなたがMySQLの/ MariaDBでINTEGERに文字列をキャストし、それはINTEGERで始まる場合=>今、あなたが得るだろう、これだけNUMBER_subkeyが残されたキーからprefix_main_key_が削除さprefix_main_key_NUMBER_subkeyを検索INTEGERはこのようになります。:)

関連する問題