it-swarm.com.de

Summieren Sie die Gesamtmenge eines bestimmten Produkts, das pro Benutzer gekauft wurde, und zeigen Sie es in einer Tabelle an

Ich habe dies in Stackoverflow gefragt, aber ich dachte, dies wäre eine spezifischere Domäne, um meine Frage zu beantworten ...

Ich habe eine große MySQL-Tabelle (im Woocommerce), in der Leute Artikel mehr als einmal kaufen können.

Mein Ziel ist es, die Menge des von user_id gekauften Produkts so zu gruppieren, dass jede Zeile benutzer- und produktspezifisch ist.

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

usw

Ich habe this code gefunden, konnte aber die benötigte Tabelle nicht generieren. In Zukunft möchte ich die Möglichkeit hinzufügen, nur bestimmte Produkte in der Tabelle (über die SKU) und möglicherweise deren Status anzuzeigen. Ich würde Dropdown-Menüs hinzufügen, um die SQL-Abfrage dynamisch zu ändern, damit die Tabelle das generiert, was ich will. Aber es ist meine oberste Priorität, herauszufinden, wie ich den Tisch überhaupt zum Generieren bringen kann!

<?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

WooCommerce: Bestellinformationen für alle Benutzer abrufen.

Ich habe versucht, Ihnen zu helfen, loszulegen. Nach einer Weile hatte ich eine vollständige Lösung: S ...

Hier ist also ein getesteter einzelner Shortcode, der Ihren <table> ausgibt (nur WooCommerce 3+):

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;

}

Platziere dieses Snippet in deinem ( child ) Theme functions.php.

Verwenden Sie den Shortcode [user_order_info_table] in Posts und Seiten, wo immer Sie möchten.

Sehen Sie es bei der Arbeit hier in meiner Sandbox.

HINWEIS: Es funktioniert, aber dies ist keine endgültige Version, die sofort lieferbar ist. Sie möchten wahrscheinlich weitere Fehlerbehandlungen durchführen usw.

Grüße, Björn

0
Bjorn