web-dev-qa-db-fra.com

Problème avec foreach sur le méta_key dupliqué

Je stocke en utilisant les valeurs personnalisées add_user_meta qui sont envoyées à la page d'accueil du site. Voici le code php.

$user_query = new WP_User_Query( array(
          'fields' => 'ID'
      ) );
    $user_ids = $user_query->get_results();
    foreach( $user_object->_custom_link as $user_id ) {
        $user_object = get_userdata( $user_ids );
        echo '<li class="quick-link custom"><img src="http://compass/wp-content/uploads/2015/12/add-icon.png" /><h2><a href="'.$user_object->_custom_link.'">Custom Link</a></h2></li>';
    }

Lorsque tout est généré, une seule méta-valeur est renvoyée, mais plusieurs valeurs peuvent être stockées. enter image description here

Ma question est, en ce moment, mes boucles vérifient uniquement les identifiants. Je ne suis pas tout à fait sûr de savoir comment les vérifier, puis vérifie le nombre de méta_keys de _custom_link. enter image description here

Cela montre qu'une seule méta_key est retournée. De plus, si vous avez une meilleure méthode, cela serait grandement apprécié.

2
Cam

Voici un exemple d'obtention des ID utilisateur, en les parcourant, en saisissant une méta_key en tant que tableau, en lui ajoutant de nouvelles valeurs et en supprimant les anciennes valeurs, en sauvegardant la méta, puis en la récupérant pour parcourir en boucle chaque élément du tableau. . Array est juste un exemple de clés dupliquées.

$user_query = new WP_User_Query( array( 'fields' => 'ID' ));
$user_ids = $user_query->get_results();

echo "<ul>";

foreach ( $user_ids as $user_id ) {

    // all meta for user
    $all_meta_for_user = array_map( function( $a ){ return $a[0]; }, get_user_meta( $user_id ) );

    echo "<pre>";
    print_r ( $all_meta_for_user ); // see all the values
    echo "</pre>";

    $key = '__TEST_KEY';
    $value_set = array();
    if( isset( $all_meta_for_user [ $key ] )) {
        $value_set = get_user_meta ( $user_id, $key, true );
        if( ! is_array( $value_set )) $value_set = array(); // make sure we're working with an array
    }

    // add to existing values
    $value_set[] = timer_stop(4);

    // remove old items
    if( count ($value_set) > 4 ) array_shift ($value_set);

    // set the meta
    update_user_meta($user_id, $key, $value_set );

    // LATEST VALUES
    $value_set = get_user_meta ( $user_id, $key, true );

    echo "<pre>";
    print_r ( $value_set ); // the value set currently in our meta
    echo "</pre>";

    foreach ( $value_set as $inx => $value ){
        echo "<li>{$user_id} - {$key} - {$inx} - {$value}</li>";
    }
    echo "</ul>";
}

echo "</ul>";
1
jgraup

Je cherchais depuis longtemps une solution à ce type de requête dans wp_usermeta et maintenant je peux trier les valeurs pour chaque utilisateur enregistré créant une requête et utilisant un LEFT JOIN en utilisant la classe wpdb, je sais que cet article est un peu désuet mais je me suis senti obligé de partager mon script parce que votre message me fait persister jusqu'à ce que je trouve une solution, j'espère que cela peut aider.

<?php
   $sql_query =<<<SQL
   SELECT
     {$wpdb->users}.user_email,
     {$wpdb->users}.user_nicename,
     {$wpdb->usermeta}.meta_value
   FROM
     {$wpdb->users}
     LEFT JOIN {$wpdb->usermeta} ON {$wpdb->users}.ID = {$wpdb->usermeta}.user_id
   WHERE 1=1
     AND {$wpdb->users}.user_status = '0'
     AND {$wpdb->usermeta}.meta_key = 'ma_deposito'
    /* AND {$wpdb->usermeta}.meta_value = '50'// busca meta_value pelo valor*/ 
   SQL;
     $users = $wpdb->get_results($sql_query);
    //header('Content-type:text/plain');
    // print_r($usersemails);
    foreach ( $users as $indce => $valor ) :
        echo 'Apelido: '. $valor->user_nicename . ' - E-mail: '. $valor->user_email. ' - Valor: '. $valor->meta_value.'<br />';
    endforeach;
   ?>
0
DiBritto