web-dev-qa-db-de.com

Rufen Sie eine post_id ab, bei der meta_value einem serialisierten meta_value-Feld entspricht

Ich speichere die Post-IDs von CPT productsim Post-Meta von CPT companies(meta_key = prefix_products). Da ein Unternehmen mehrere Produkte haben kann, speichere ich sie in einem PHP serialisierten Array-Wert.

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

Wobei 334, 333, 331 drei Post-IDs des Post-Typs productssind.

Ich muss die post_id des CPT abrufen. companiesname__, wobei die Produkt-ID (post_id von CTP productsname__) gleich 331 ist (dynamisch - kann ein beliebiger Wert sein). Es sollte mit dem meta_value des meta_key prefix_products verglichen werden.

Ich kann post_id mit einem meta_value erhalten, aber ich stecke fest, wo die Daten als serialisiert gespeichert werden. :(

Was ich bisher gemacht habe, kommt nicht zur Lösung:

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);
}

Ist das der Weg, oder fehle ich etwas ernsthaft Leichtes? Wie kann ich das Rätsel lösen?

2
Mayeenul Islam

Ich würde nachdrücklich empfehlen, die Produkte zu trennen und nicht alle in einem Array zusammenzufassen. Oder sogar eine Taxonomie-Firma zu gründen, aber dies ist eher dem zeitgemäßen Design und vielleicht eine schlechte Idee. Trotzdem ist dies eine schöne Frage, also lasst uns spielen.

Der 'prefix_products'-Metaschlüssel ist also immer eine Reihe von Produkten. Jetzt brauchen Sie alle Firmen, die ein Produkt mit einer bestimmten ID verkaufen.

Dies sollte den Trick machen:

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

Es ist nicht möglich, diesen Wert müssen Sie separat speichern, und dann können Sie ihn verwenden.

1
Erez.info

Dies ist sehr gut möglich, wenn auch möglicherweise langsam. Es handelt sich im Wesentlichen um eine umgekehrte Beziehungssuche, die häufig bei erweiterten benutzerdefinierten Feldern oder anderen benutzerdefinierten Feldern für Beziehungen verwendet wird.

Im Folgenden werden nicht nur die IDs abgerufen, sondern ein Array von Posts-Objekten über WP_Query zurückgegeben.

$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;

(Entschuldigen Sie mein PHP, ich habe viel in Blade gearbeitet und es ist schwierig, zurückzukehren.)

0
Slam