דוח מלאיים בחנות ווקומרס

הצגת מלאים בחנות וורדפרס

טוב אז כשאת הלקוחה של עצמך ואת לא רק בונה אתר אלא באמת מנהלת חנות פתאום מתברר שאת צריכה כל מיני דוחות שאין במערכת.

אחרי שחיפשתי תוספים לדוחות ולא מצאתי שום דבר שהתאים לי בול החלטתי ליצור fetch  קטן לצרכים שלי (פעם גם אארוז אותו כתוסף).

הנה הקוד שמציג את כל טבלת המלאים של המוצרים באתר כולל הואריאציות שלהם.

תחת כל מוצר מוצגות הואריאציות שלו.

אני לא מצפה שבעלי חנויות ידעו מה לעשות עם הקוד הזה אבל בוני אתרים שנתקלים בדרישה לתת דוח מוצרים מוזמנים להשתמש בקוד הזה.

תהנו.

כמה הערות:

* בחנות שלי כל מוצר יכול להיות שייך ליותר מקטגוריה אחת. בטבלת המלאים הוא יוצג תחת אחת מהן בלבד (הראשונה שבהן). הדבר הספציפי לי בקוד הזה הוא התעלמות מקטגוריה מספר 15 (אצלי היא קטגוריה נבחרים ולא בא לי שבטבלת המוצרים יופיעו מוצרים תחת הקטגוריה נבחרים.

* הטבלה מציגה את המלאים והם יכולים להיות שליליים כי בחנות שלי מותר להזמין מוצר שאינו במלאי (ואפילו ללא התרעה). מוצר שלא ניתן להזמין (נניח שחסר אצל הספק) הועבר למצב טיוטה ולכן לא יוצג באתר וגם לא בדוח המלאים.

* רצוי שלא יהיו לכם מוצרים מפורסמים שאינם מקוטלגים לאף קטגוריה (אם יש כאלו הם יוצגו תחת קטגוריה ללא שם)

העתיקו את הקוד הזה לעורך שלכם (כדוגמאת notepad++)  ושמרו בקובץ כדוגמת fetch.php

הנה הקוד במלאו


<?php
/* brings from DB quantity of all products */

 

require('wp-config.php');

$product_categories= array();

global $wpdb;

$sql = "SELECT `ID`,`post_name`,`post_title`
FROM `wp_posts`
WHERE `post_type` LIKE 'product'
AND `post_status` LIKE 'publish'";

$content = $wpdb->get_results($sql);

$results= array();

$i=0;
foreach($content as $product){
$product_id = $product->ID;
$product_name = $product->post_name;
$product_title = $product->post_title;

$oneResult['product_id']= $product_id;
$oneResult['post_name']= $product_name;
$oneResult['post_title']= $product_title;

$sql = "SELECT `meta_value`
FROM `wp_postmeta`
WHERE `meta_key` LIKE '_stock'
AND `post_id` LIKE '".$product_id."'";

$content3 = $wpdb->get_results($sql);
foreach($content3 as $product3){

$stock = $product3->meta_value;
}

$oneResult['stock']= $stock;

$terms = wp_get_post_terms($product_id, 'product_cat', array("fields" => "all"));
foreach ( $terms as $term ) {
if ($term->term_id != 15)
$tn=$term->name;

}
//$tn=$terms[0]->name;

$product_categories[$tn][$i]= $oneResult;
unset($oneResult);
$i++;

$terms = wp_get_post_terms($product_id, 'product_type', array("fields" => "all"));
foreach ( $terms as $term ) {
$pt=$term->name;

}

if($pt == 'simple') { continue; }

//get variation product of this product
$sql2 = "SELECT `ID`,`post_name`,`post_title`
FROM `wp_posts`
WHERE `post_type` LIKE 'product_variation'
AND `post_parent` LIKE '".$product_id."'
AND `post_status` LIKE 'publish'";

$content2 = $wpdb->get_results($sql2);

foreach($content2 as $varProduct){

$varProduct_id = $varProduct->ID;
$varProduct_name = $varProduct->post_name;
$varProduct_title = $varProduct->post_title;

$sql3 = "SELECT `meta_value`
FROM `wp_postmeta`
WHERE `meta_key` LIKE '_stock'
AND `post_id` LIKE '".$varProduct_id."'";

$content3 = $wpdb->get_results($sql3);
foreach($content3 as $product3){

$varStock = $product3->meta_value;
}

//$meta_values = get_post_meta( $varProduct_id );
//echo '<pre>'.print_r($meta_values,TRUE).'</pre>';
$pp=get_product( $varProduct_id );
// $vdaa= $pp->get_variation_attributes();
// foreach ( $vdaa as $name => $value )
// {
// if ( ! $value )
// {
// continue;
// }
// else
// {
// $vd=$value;
// }
// }

$vd= wc_get_formatted_variation( $pp->get_variation_attributes(), true );

$oneResult['product_id']= $varProduct_id;
$oneResult['post_name']= $varProduct_name;
$oneResult['post_title']= $varProduct_title;
$oneResult['variation_val']= $vd;
$oneResult['stock']= $varStock;

$product_categories[$tn][$i]= $oneResult;
unset($oneResult);
$i++;

}

}

//echo '<pre>'.print_r($product_categories,TRUE).'</pre>';

echo '<table>';
foreach($product_categories as $x => $x_value) {
//echo "Key=" . $x . ", Value=" . $x_value;
echo "<tr><td>category=" . $x.'</td></tr>';

foreach($x_value as $y => $y_value) {
echo '<tr>';
//echo "Key=" . $y . ", Value=" . $y_value;
//echo "<td>" . $y.'</td>';
echo '<td>'.$y_value['product_id'].'</td>';
echo '<td>'.$y_value['post_title'].'</td>';
echo '<td>'.$y_value['variation_val'].'</td>';
echo '<td>'.$y_value['stock'].'</td>';
echo '</tr>';
}

}
echo '</table>';
?>

 

את הקובץ הזה אני שמה על השרת בתיקייה הראשית איפה שיושב wp_config ואני מריצה אותו באמצעות כתיבת ה url שלו למשל www.example.com/fetch3.php

ועכשיו נעבור שורה שורה ונראה מה כתוב פה:

<?php
/* brings from DB quantity of all products */

 

/*  שורת הקוד הזו מאפשרת לי גישה לבסיס הנתונים של וורדפרס  */

require('wp-config.php');

/* הכנתי מערך שבו ישבו בסוף כל המוצרים וכל הוריאציות שלהם כאשר המפתח הראשון הוא שמות הקטגוריות ולכן קראתי לו כך */

$product_categories= array();

global $wpdb;

/*זוהי שאילתת sql שמביאה לי את כל המוצרים הפשוטים שפורסמו */

$sql = "SELECT `ID`,`post_name`,`post_title`
FROM `wp_posts`
WHERE `post_type` LIKE 'product'
AND `post_status` LIKE 'publish'";

$content = $wpdb->get_results($sql);

$results= array();

/* המונה i נועד לכך שהמוצרים יופיעו בסדר רץ במערך של המוצרים אחרי מוצר פשוט יבואו הואריאציות שלו
בתחילה שמתי את המוצרים לפי המספר המזהה id שלהם אבל אז הגעתי למצב שוריאציות לא בהכרח ישבו מיד אחרי המוצר שאליו הם מתייחסות */

$i=0;
foreach($content as $product){

/* אני מושכת ממוצר כמה פרטים שלו – מזהה, שם וכותרת */

$product_id = $product->ID;
$product_name = $product->post_name;
$product_title = $product->post_title;

/* אני מכינה מערך של תוצאות ובו פרטי מוצר בודד */

$oneResult['product_id']= $product_id;
$oneResult['post_name']= $product_name;
$oneResult['post_title']= $product_title;

/*הכמות במלאי יושבת בטבלת wp_postmeta ולכן אני כותבת שאילתה שתביא לי אותה לפי מזהה הפוסט */

$sql = "SELECT `meta_value`
FROM `wp_postmeta`
WHERE `meta_key` LIKE '_stock'
AND `post_id` LIKE '".$product_id."'";

$content3 = $wpdb->get_results($sql);
foreach($content3 as $product3){

$stock = $product3->meta_value;
}

/* אני מוסיפה את המלאי למערך של פרטי המוצר הבודד */

$oneResult['stock']= $stock;

/* אני רוצה לבדוק לאיזה קטגוריה המוצר שייך כדי לשים אותו במערך הגדול תחת הקטגוריה המתאימה
הקטגוריות הן terms ולכן אני בודקת לאיזה term המוצר שלי שייך
מוצר יכול להיות שייך למספר קטגוריות
אני למעשה מאנדקסת אותו לפי הקטגוריה האחרונה שהיא לא 15 ואליה הוא שייך
15 אצלי זה מוצרים נבחרים
לא בא לי שמוצרים יוצגו בטבלת המלאיים לפי הקטגוריה נבחרים
אני בונה על זה שאף מוצר לא יהיה שייך רק לנבחרים */

$terms = wp_get_post_terms($product_id, 'product_cat', array("fields" => "all"));
foreach ( $terms as $term ) {
if ($term->term_id != 15)
$tn=$term->name;

}
//$tn=$terms[0]->name;

/* כאן אני שמה במערך הסופי שלי את המוצר
אני עושה את זה לפי הקטגוריה אחרונה
term_name ששמור אצלי במשתנה tn
הערך של i כזכור הוא ערך רץ */

$product_categories[$tn][$i]= $oneResult;

/* חשוב לי לרוקן את מערך הפריט לקראת ההמשך שלא ישב בו משהו שלא קיים במוצר הבא ואז זה יהיה זבל ישן */

unset($oneResult);

/* ברגע שסיימתי עם מוצר (במקרה הזה מוצר פשוט) אני מגדילה את האינדקס שלי */

$i++;

/* הפתעה הפתעה
יש במערכת מלא ואריאציות לא אמיתיות
מוצרים שהיו מורכבים והפכו לפשוטים
מוצרים ששכפלו מכאלו שהיו מורכבים והם פשוטים
לכן אני בודקת term שנקרא product_type
במידה והוא simple אז לצאת מהלולאה למוצר הבא כי הואיאציות של מוצר פשוט לא מעניינות אותי */

$terms = wp_get_post_terms($product_id, 'product_type', array("fields" => "all"));
foreach ( $terms as $term ) {
$pt=$term->name;
}
if($pt == 'simple') { continue; }

/* עכשיו אני מביאה את הואריאציות של המוצר שלפני רגע הכנסתי למערך הסופי שלי */

//get variation product of this product
$sql2 = "SELECT `ID`,`post_name`,`post_title`
FROM `wp_posts`
WHERE `post_type` LIKE 'product_variation'
AND `post_parent` LIKE '".$product_id."'
AND `post_status` LIKE 'publish'";

$content2 = $wpdb->get_results($sql2);

foreach($content2 as $varProduct){

$varProduct_id = $varProduct->ID;
$varProduct_name = $varProduct->post_name;
$varProduct_title = $varProduct->post_title;

/* כזכור את הכמות במלאי מביאים מטבלה אחרת wp_postmeta */

$sql3 = "SELECT `meta_value`
FROM `wp_postmeta`
WHERE `meta_key` LIKE '_stock'
AND `post_id` LIKE '".$varProduct_id."'";

$content3 = $wpdb->get_results($sql3);
foreach($content3 as $product3){
$varStock = $product3->meta_value;
}

/* חשוב לי להוסיף גם פרטים נוספים למערך. גיליתי ששמות הואריאציות לא תמיד הגיוניות
אולי במיוחד כשמשכפלים מוצרים ולכן אני רוצה להציג את פרטים של הואריאציה */

$pp=get_product( $varProduct_id );
$vd= wc_get_formatted_variation( $pp->get_variation_attributes(), true );

/* אני מכינה פרטי מוצר בודד ושמה אותם בשלמות במערך התוצאות הסופיות שלי תחת שם הקטגוריה והאינדקס הרץ שלי */

$oneResult['product_id']= $varProduct_id;
$oneResult['post_name']= $varProduct_name;
$oneResult['post_title']= $varProduct_title;
$oneResult['variation_val']= $vd;
$oneResult['stock']= $varStock;

$product_categories[$tn][$i]= $oneResult;

/* הנה דוגמא מצויינת למה צריך לנקות את המערך הזה כי אולי המוצר הבא לא יהיה ואריאציה ואין לו פרטי ואריאציה  */

unset($oneResult);

/* ברגע שסיימתי עם מוצר (במקרה הזה ואריאציה) אני מגדילה את האינדקס שלי */

$i++;

}

}

/* כל מה שנשאר זה להציג פלט
אני מציגה את זה בטבלה כדי שיהיה קל להעתיק את זה לאקסל
אני עוברת על המפתחות של המערך הסופי שלי ומציגה את הערכים */

echo '<table>';
foreach($product_categories as $x => $x_value) {

echo "<tr><td>category=" . $x.'</td></tr>';

foreach($x_value as $y => $y_value) {
echo '<tr>';
//echo "<td>" . $y.'</td>';
echo '<td>'.$y_value['product_id'].'</td>';
echo '<td>'.$y_value['post_title'].'</td>';
echo '<td>'.$y_value['variation_val'].'</td>';
echo '<td>'.$y_value['stock'].'</td>';
echo '</tr>';
}

}
echo '</table>';

?>

תהיו חברתיים. שתפו...

כתיבת תגובה