web-dev-qa-db-fra.com

Somme du montant total d'un produit acheté depuis un tableau

J'ai posé cette question dans Stackoverflow mais j'ai pensé que ce serait un domaine plus spécifique pour répondre à ma question ...

J'ai une grande table mysql (dans woocommerce) où les gens peuvent acheter des articles plus d'une fois.

Mon objectif est de pouvoir regrouper la quantité de produit achetée par user_id afin que chaque ligne soit spécifique à l'utilisateur et au produit.

user ID | Product | quantity | billing address 
23      | chair   | 4        | 22 Bank street
42      | chair   | 12       | 123 Smith Road
88      | chair   | 5        | 3 Parker avenue

etc

J'ai trouvé this code, mais n'ai pas pu générer la table dont j'avais besoin. À l'avenir, j'aimerais ajouter la possibilité d'afficher uniquement des produits spécifiques dans le tableau (via SKU) et peut-être leur statut. Je voudrais ajouter des menus déroulants pour modifier dynamiquement la requête SQL afin que la table génère ce que je veux. Mais trouver le moyen de générer le tableau en premier lieu est ma priorité numéro un!

<?php 
if (!is_user_logged_in() || !current_user_can('manage_options')) wp_die('This page is private.');

$con=mysqli_connect("ip","user","pass","database");
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,
"select p.user_id,
       max( CASE WHEN pm.meta_key = '_sku' and p.ID = pm.post_id THEN pm.meta_value END ) as _sku,
       max( CASE WHEN pm.meta_key = '_amount' and p.ID = pm.post_id THEN pm.meta_value END ) as _amount,
       max( CASE WHEN pm.meta_key = '_billing_address_1' and p.ID = pm.post_id THEN pm.meta_value END ) as _billing_address_1,
       group_concat(distinct oi.order_item_name separator '|' ) as order_items
from wp_posts p join
    wp_postsmeta pm
    on p.ID = pm.post_id join
    wp_woocommerce_order_items oi
where p.post_type = 'shop_order' and
      p.post_status = 'wc-completed' and
      oi.order_item_name = 'Product Name'
group p.user_id");
echo "<table>";
while($row = mysqli_fetch_array($result))
{
echo "<tr style='font-size: 0.665em'>";
echo "<td>"  . $row['user_id'] . "</td>";
echo "<td>" . $row['amount'] . "</td>";
echo "<td>" . $row['billing_address_1'] . "</td>";
echo "</tr>";
}
echo "</table>";
?>
1
Nicholas Ravanelli

WooCommerce: obtenez des informations sur les commandes pour tous les utilisateurs.

J'essayais de vous aider à y aller .. Après un moment, j'ai eu une solution complète: S ...

Voici donc un shortcode unique testé qui génère votre <table> (WooCommerce 3+ uniquement):

add_shortcode('user_order_info_table', 'sc_user_order_info_table_callback');
function sc_user_order_info_table_callback() {

  $result_array = array();
  $users = get_users();

  if($users) {

    foreach ($users as $user) {
      $products_ordered = array();

      $order_args = array(
        'posts_per_page' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => $user->ID,
        'post_type'   => 'shop_order',
        'post_status' => 'wc-completed', // only get completed orders
      );
      $orders = get_posts($order_args);

      if($orders) {
        foreach ($orders as $order) {
          $wc_order = wc_get_order( $order->ID );

          foreach ($wc_order->get_items() as $product) {
            $wc_product = wc_get_product($product->get_product_id());

            if($wc_product) { // make sure the product still exists
              if( ! isset( $products_ordered[$product->get_product_id()] ) ) {
                $products_ordered[$product->get_product_id()] = array(
                  'name' => $product->get_name(),
                  'qty' => $product->get_quantity(),
                );
              } else {
                $products_ordered[$product->get_product_id()]['qty'] = $products_ordered[$product->get_product_id()]['qty'] + $product->get_quantity();
              }

              // get sku example
              //$wc_product->get_sku();
            }
          }
        }
      }

      $customer = new WC_Customer( $user->ID );
      $billing_data = $customer->get_billing('view');
      $user_billing_address1 = $billing_data['address_1'];

      // we have collected all data, save it to array
      $result_array[$user->ID] = array(
        'products_ordered' => $products_ordered,
        'address1' => $user_billing_address1,
      );

    }
  } else {

  }

  // shortcode html output begins hebrev
  $return_html = '<table><thead><tr><td>User ID</td><td>Product</td><td>Quantity</td><td>billing address 1</td></tr></thead><tbody>';

  foreach ($result_array as $user_id => $data) {
    if( isset($data['products_ordered']) && $data['products_ordered'] ) {
      foreach ($data['products_ordered'] as $product_id => $product_data) {
        $return_html .= '<tr>';
        $return_html .= '<td>'.$user_id.'</td>';
        $return_html .= '<td>'.$product_data['name'].'</td>';
        $return_html .= '<td>'.$product_data['qty'].'</td>';
        $return_html .= '<td>'.$data['address1'].'</td>';
        $return_html .= '</tr>';
      }
    }
  }

  $return_html .= '</tbody></table>';

  return $return_html;

}

Placez cet extrait dans votre thème ( child ) theme functions.php.

Utilisez le shortcode [user_order_info_table] dans les publications et les pages où vous voulez.

Voir cela @ travail ici dans mon bac à sable.

REMARQUE: cela fonctionne, mais il ne s'agit pas d'une "version finale" prête à être expédiée. Vous voulez probablement faire plus de gestion des erreurs, etc.

Cordialement, Bjorn

0
Bjorn