web-dev-qa-db-fra.com

Obtenir un post_id où meta_value est égal à quelque chose dans un champ sérialisé meta_value

J'enregistre CPT products 'post ID dans CPT companies' post meta (meta_key = prefix_products). Comme une entreprise peut avoir plusieurs produits, je les stocke donc dans un tableau PHP sérialisé.

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

Où 334, 333, 331 sont trois types de publication du type de publication products.

Je dois obtenir le post_id du CPT companies où l'id du produit (post_id de CTP products) est égal à 331 (dynamique - peut être n'importe quelle valeur). Il devrait être comparé à meta_value de la meta_key prefix_products.

Je peux obtenir post_id en utilisant une meta_value, mais je suis bloqué là où les données sont stockées en tant que sérialisées. :(

Ce que j'ai fait jusqu'à présent ne permet pas d'arriver à la solution:

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

Est-ce le cas ou manque-t-il quelque chose de vraiment facile? Comment puis-je résoudre l'énigme?

2
Mayeenul Islam

Je suggère fortement de séparer les produits et de ne pas les mettre tous dans le même tableau. Ou même pour créer une taxonomie, mais cela est plus à la hauteur de la conception et peut-être une mauvaise idée. Néanmoins, c’est une bonne question à résoudre, alors jouons.

Ainsi, la clé méta 'prefix_products' est toujours un tableau de produits. Vous avez maintenant besoin de toutes les entreprises qui vendent un produit avec un certain identifiant.

Cela devrait faire l'affaire:

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

Ce n'est pas possible, vous devez stocker cette valeur séparément, puis vous pourrez l'utiliser.

1
Erez.info

C'est très possible mais peut-être lent. Il s’agit essentiellement d’une recherche de relation inverse et est courante dans les champs personnalisés avancés ou dans tout autre champ personnalisé utilisé pour les relations.

Ce qui suit n'obtient pas uniquement les ID, il retourne un tableau d'objet posts via WP_Query.

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

(Excusez mon PHP, j'ai beaucoup travaillé dans Blade et il est difficile de revenir en arrière)

0
Slam