web-dev-qa-db-ja.com

Meta_valueが直列化されたmeta_valueフィールドの何かに等しいpost_idを取得します

CPTのproductsの投稿IDをCPTのcompaniesの投稿メタに格納しています(meta_key = prefix_products)。企業は複数の製品を持つことができるので、それらをPHPシリアライズされた配列値に格納しています。

s:48:"a:3:{i:0;s:3:"334";i:1;s:3:"333";i:2;s:3:"331";}";

334、333、331は投稿タイプproductsの3つのpost_idです。

CPTのpost_idを取得する必要がありますcompaniesここで、製品ID(CTPのpost_id products)は331(動的 - 任意の値)になります。 meta_key prefix_productsのmeta_valueと比較してください。

Meta_valueを使用してpost_idを取得できますが、データがシリアル化されたとおりに格納されている場所で動けなくなります。 :(

私がこれまでにやったことは、解決策を得ることができない:

function get_company_of_the_product( $product_id ) {
    global $project_prefix;
    $prod_meta_key = $project_prefix .'products';

    $companies = get_posts( array(
            'post_type'     => 'companies',
            'post_status'   => 'publish',
            'meta_key'      => $prod_meta_key
        ) );
    $products_array = array();
    foreach ( $companies as $company ) {
        $products = get_post_meta( $company->ID, $prod_meta_key, true );
        $products_array[$company->ID] = unserialize( $products );
        //if( in_array( $product_id, $products_array ) ) return $company->ID; //I know it's wrong
    }

    var_dump($products_array);
}

これはそうなのでしょうか、それとも私は真剣に簡単な何かを逃していますか?謎を解くにはどうすればいいですか。

2
Mayeenul Islam

製品を分離し、それらすべてを1つの配列にまとめないようにすることを強くお勧めします。あるいは分類学の会社を作ることさえできますが、これはもっと設計次第で、おそらく悪い考えかもしれません。それにもかかわらず、これは解決すべき素晴らしい質問ですので、遊ぼう。

そのため、'prefix_products'メタキーは常に製品の配列です。今、あなたは特定のIDを持つ製品を販売するすべての会社が必要です。

これでうまくいくはずです。

function get_all_companies_selling( $product_id ){
    global $wpdb;
    $sql = "select post_id from " . $wpdb->prefix . "postmeta where
        meta_key = 'prefix_products' &&
        meta_value like '%%%s%%'";

    $product_id = 's:' . strlen( $product_id ) . ':"' . (int) $product_id . '";';
    $sql = $wpdb->prepare( $sql, $product_id );
    $res = $wpdb->get_results( $sql );

    return $res;
}

get_all_companies_selling( 331  );
1
websupporter

それは不可能です、あなたはその値を別に格納しなければなりません、そしてそれからあなたはそれを使うことができるでしょう。

1
Erez.info

遅いかもしれませんが、これは非常に可能です。これは基本的に逆の関係検索であり、高度なカスタムフィールドや関係に使用される他のカスタムフィールドと共通です。

以下はIDだけでなく、WP_Queryを介してpostsオブジェクトの配列を返します。

$some_product_id = '123';
$args= array(
  'post_type' => 'companies',  // only search postmeta of these cpts
  'posts_per_page' => 5,  // limit or not depending on your use
  'orderby' => 'date',  // use whatever order you like
  'meta_query' => array(
    array(
    'key' => 'prefix_products', // name of custom field
    'value' => '"' . $some_product_id . '"', // matches exactly "123" not just 123.
    'compare' => 'LIKE'
  )
);

$the_related_companies = new WP_Query( $args );

if( $the_related_companies->have_posts() ) :
  <div class="container">
  while( $the_related_companies->have_posts() ) :
    [do stuff with your posts]
  endwhile;
  </div>
endif;

(私のPHPを恐れて、私はBladeで多くの仕事をしてきました、そして戻るのは難しいです)

0
Slam