Website : phonehp.ir
backdoor
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Home
Console
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Warning
: Undefined variable $backdoor in
/home/nehpir/public_html/goods.php
on line
326
Upload
information
Create File
Create Folder
About
Tools
:
/
home
/
nehpir
/
public_html
/
wp-content
/
plugins
/
woocommersa
/
includes
/
Repositories
/
Filename :
ProductRepository.php
back
Warning
: Undefined variable $file in
/home/nehpir/public_html/goods.php
on line
545
Copy
<?php namespace WooCommersa\Repositories; if (!defined('ABSPATH')) exit; class ProductRepository { /** * Get products with professional filtering engine */ public function get_products($params) { $settings = get_option('woocommersa_settings', []); $page = max(1, (isset($params['page']) ? intval($params['page']) : 1)); $per_page = (isset($params['per_page']) ? intval($params['per_page']) : ($settings['items_per_page'] ?? 25)); $args = [ 'limit' => $per_page, 'page' => $page, 'paginate' => true, 'status' => $params['status'] ?? 'any', 'orderby' => 'date', 'order' => 'DESC', ]; // Isolate data for Dokan Vendors if (function_exists('dokan_is_user_seller') && dokan_is_user_seller(get_current_user_id()) && !current_user_can('manage_woocommerce')) { $args['author'] = get_current_user_id(); } elseif (!empty($params['vendor']) && current_user_can('manage_woocommerce')) { $args['author'] = intval($params['vendor']); } $meta_query = ['relation' => 'AND']; $tax_query = ['relation' => 'AND']; // Robust Global Search (Title OR SKU OR ID) if (!empty($params['search'])) { $s = sanitize_text_field($params['search']); if (strpos($s, 'id:') === 0) { $id = intval(substr($s, 3)); if ($id > 0) { $args['include'] = [$id]; } } else { global $wpdb; $search_ids = $wpdb->get_col($wpdb->prepare( "SELECT DISTINCT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_sku' WHERE p.post_type IN ('product', 'product_variation') AND (p.post_title LIKE %s OR pm.meta_value LIKE %s OR pm.meta_value = %s)", '%' . $wpdb->esc_like($s) . '%', '%' . $wpdb->esc_like($s) . '%', $s )); if (!empty($search_ids)) { $args['include'] = $search_ids; } else { return ['products' => [], 'total' => 0, 'pages' => 0]; } } } // Category & Attributes if (!empty($params['category'])) { $args['category'] = [sanitize_text_field($params['category'])]; } if (!empty($params['stock_status'])) { $args['stock_status'] = sanitize_text_field($params['stock_status']); } // Smart Filter Engine $sm_filters_raw = $params['smart_filters'] ?? null; $sm_filters = []; if (!empty($sm_filters_raw)) { if (is_string($sm_filters_raw)) { $decoded = json_decode(wp_unslash($sm_filters_raw), true); if (json_last_error() !== JSON_ERROR_NONE) $decoded = json_decode(stripslashes($sm_filters_raw), true); if (json_last_error() !== JSON_ERROR_NONE) $decoded = json_decode($sm_filters_raw, true); $sm_filters = is_array($decoded) ? $decoded : []; } elseif (is_array($sm_filters_raw)) { $sm_filters = $sm_filters_raw; } } if (is_array($sm_filters) && count($sm_filters) > 0) { global $wpdb; foreach ($sm_filters as $rule) { $field = $rule['field'] ?? ''; $op = $rule['operator'] ?? '='; $val = $rule['value'] ?? ''; if (in_array($field, ['regular_price', 'sale_price', 'price', 'stock', 'id'])) { $val = \WooCommersa\Core\Utils::normalize_number($val); } if ($field === 'category' ? empty($val) : ($val === '' && !in_array($op, ['EXISTS', 'NOT EXISTS']))) continue; $filter_ids = []; switch ($field) { case 'name': $op_sql = ($op === 'contains') ? 'LIKE' : (($op === '!=') ? 'NOT LIKE' : '='); $val_sql = ($op === 'contains' || $op === '!=') ? '%' . $wpdb->esc_like($val) . '%' : $val; $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_type IN ('product', 'product_variation') AND post_title {$op_sql} %s", $val_sql)); break; case 'id': if ($op === '=') { $filter_ids = [$val]; } elseif ($op === '!=') { $args['exclude'] = !empty($args['exclude']) ? array_merge($args['exclude'], [$val]) : [$val]; continue 2; } else { $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_type IN ('product', 'product_variation') AND ID {$op} %d", $val)); } break; case 'regular_price': case 'sale_price': case 'price': $meta_key = ($field === 'regular_price') ? '_regular_price' : (($field === 'sale_price') ? '_sale_price' : '_price'); $op_sql = ($op === 'contains') ? 'LIKE' : $op; $val_sql = ($op === 'contains') ? '%' . $wpdb->esc_like($val) . '%' : $val; $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND CAST(meta_value AS DECIMAL(20,4)) {$op_sql} %s", $meta_key, $val_sql)); break; case 'stock': $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_stock' AND CAST(meta_value AS DECIMAL(15,2)) {$op} %f", $val)); break; case 'sku': $op_sql = ($op === 'contains') ? 'LIKE' : $op; $val_sql = ($op === 'contains') ? '%' . $wpdb->esc_like($val) . '%' : $val; $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value {$op_sql} %s", $val_sql)); break; case 'stock_status': $op_sql = ($op === '!=') ? '!=' : '='; $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_stock_status' AND meta_value {$op_sql} %s", $val)); break; case 'brand': $brand_service = \WooCommersa\Services\BrandService::get_instance(); $source = $brand_service->get_configured_source(); if ($source && !empty($val)) { $op_sql = ($op === '!=') ? 'NOT IN' : 'IN'; if ($source['type'] === 'taxonomy' || $source['type'] === 'attribute') { $terms = is_array($val) ? array_map('intval', $val) : [intval($val)]; if (!empty($terms)) { $filter_ids = $wpdb->get_col("SELECT object_id FROM {$wpdb->term_relationships} tr INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = '{$source['slug']}' AND tt.term_id {$op_sql} (" . implode(',', $terms) . ")"); } } elseif ($source['type'] === 'meta') { $meta_val = is_array($val) ? $val[0] : $val; // Meta filtering usually singular $op_meta = ($op === '!=') ? '!=' : '='; $filter_ids = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value {$op_meta} %s", $source['slug'], $meta_val)); } } break; case 'category': $terms = is_array($val) ? implode(',', array_map('intval', $val)) : intval($val); $op_sql = ($op === '!=') ? 'NOT IN' : 'IN'; $filter_ids = $wpdb->get_col("SELECT object_id FROM {$wpdb->term_relationships} tr INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'product_cat' AND tt.term_id {$op_sql} ({$terms})"); break; case 'type': $op_sql = ($op === '!=') ? 'NOT IN' : 'IN'; $term_id = $wpdb->get_var($wpdb->prepare("SELECT term_id FROM {$wpdb->terms} WHERE slug = %s", $val)); if ($term_id) { $filter_ids = $wpdb->get_col("SELECT object_id FROM {$wpdb->term_relationships} tr INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'product_type' AND tt.term_id {$op_sql} ({$term_id})"); } break; } // Map variation IDs to parent product IDs if (!empty($filter_ids)) { $parents = $wpdb->get_col("SELECT post_parent FROM {$wpdb->posts} WHERE ID IN (" . implode(',', array_map('intval', $filter_ids)) . ") AND post_type = 'product_variation' AND post_parent > 0"); $filter_ids = array_unique(array_merge($filter_ids, $parents)); } if (empty($filter_ids)) { return ['products' => [], 'total' => 0, 'pages' => 0]; } $args['include'] = !empty($args['include']) ? array_intersect($args['include'], $filter_ids) : $filter_ids; if (empty($args['include'])) { return ['products' => [], 'total' => 0, 'pages' => 0]; } } } // Health Dashboard Filters if (!empty($params['filter']) || !empty($params['health_filter'])) { $h_filter = !empty($params['filter']) ? $params['filter'] : $params['health_filter']; global $wpdb; $filter_ids = []; switch ($h_filter) { case 'no_image': case 'missing_alt': $filter_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_thumbnail_id' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (pm.meta_value IS NULL OR pm.meta_value = '')"); break; case 'no_price': $filter_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_price' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (pm.meta_value IS NULL OR pm.meta_value = '' OR pm.meta_value = '0')"); break; case 'no_sku': $filter_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_sku' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (pm.meta_value IS NULL OR pm.meta_value = '')"); break; case 'no_seo': case 'no_seo_title': $filter_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm_rm ON p.ID = pm_rm.post_id AND pm_rm.meta_key = '_rank_math_title' LEFT JOIN {$wpdb->postmeta} pm_yo ON p.ID = pm_yo.post_id AND pm_yo.meta_key = '_yoast_wpseo_title' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (pm_rm.meta_value IS NULL OR pm_rm.meta_value = '') AND (pm_yo.meta_value IS NULL OR pm_yo.meta_value = '')"); break; case 'no_seo_description': $filter_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm_rm ON p.ID = pm_rm.post_id AND pm_rm.meta_key = '_rank_math_description' LEFT JOIN {$wpdb->postmeta} pm_yo ON p.ID = pm_yo.post_id AND pm_yo.meta_key = '_yoast_wpseo_metadesc' WHERE p.post_type = 'product' AND p.post_status = 'publish' AND (pm_rm.meta_value IS NULL OR pm_rm.meta_value = '') AND (pm_yo.meta_value IS NULL OR pm_yo.meta_value = '')"); break; case 'no_description': $filter_ids = $wpdb->get_col("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish' AND post_content = ''"); break; case 'out_of_stock': $filter_ids = $wpdb->get_col("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_stock_status' AND meta_value = 'outofstock'"); break; case 'no_category': $filter_ids = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p WHERE p.post_type = 'product' AND p.post_status = 'publish' AND p.ID NOT IN (SELECT tr.object_id FROM {$wpdb->term_relationships} tr INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'product_cat')"); break; case 'duplicate_skus': $filter_ids = $wpdb->get_col("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value IN (SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value != '' GROUP BY meta_value HAVING COUNT(meta_value) > 1)"); break; } if (!empty($filter_ids)) { $args['include'] = !empty($args['include']) ? array_intersect($args['include'], $filter_ids) : $filter_ids; if (empty($args['include'])) return ['products' => [], 'total' => 0, 'pages' => 0]; } else { return ['products' => [], 'total' => 0, 'pages' => 0]; } } // Profit & Margin Filters (Complex SQL required) if (!empty($params['profit_filter'])) { $p_filter = $params['profit_filter']; $overhead = floatval($settings['profit_overhead_percent'] ?? 0); global $wpdb; $filter_ids = []; if ($p_filter === 'no_cost') { $filter_ids = $wpdb->get_col(" SELECT p.ID FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = '_cost_price' WHERE p.post_type IN ('product', 'product_variation') AND (pm.meta_value IS NULL OR pm.meta_value = '' OR pm.meta_value = '0') "); } elseif ($p_filter === 'loss' || $p_filter === 'low_margin') { $threshold = ($p_filter === 'loss') ? 0 : 15; $factor = (1 - ($overhead / 100) - ($threshold / 100)); $filter_ids = $wpdb->get_col($wpdb->prepare(" SELECT p.ID FROM {$wpdb->posts} p JOIN {$wpdb->postmeta} pm_price ON p.ID = pm_price.post_id AND pm_price.meta_key = '_price' JOIN {$wpdb->postmeta} pm_cost ON p.ID = pm_cost.post_id AND pm_cost.meta_key = '_cost_price' WHERE p.post_type IN ('product', 'product_variation') AND (CAST(pm_price.meta_value AS DECIMAL(20,4)) * %f) < CAST(pm_cost.meta_value AS DECIMAL(20,4)) ", $factor)); } if (!empty($filter_ids)) { $args['include'] = !empty($args['include']) ? array_intersect($args['include'], $filter_ids) : $filter_ids; if (empty($args['include'])) return ['products' => [], 'total' => 0, 'pages' => 0]; } else { return ['products' => [], 'total' => 0, 'pages' => 0]; } } // Sorting if (!empty($params['orderby'])) { $orderby = sanitize_text_field($params['orderby']); $order = !empty($params['order']) ? strtoupper(sanitize_text_field($params['order'])) : 'ASC'; switch ($orderby) { case 'price': case 'regular_price': $args['orderby'] = 'meta_value_num'; $args['meta_key'] = '_price'; break; case 'stock': $args['orderby'] = 'meta_value_num'; $args['meta_key'] = '_stock'; break; case 'name': $args['orderby'] = 'title'; break; default: $args['orderby'] = $orderby; } $args['order'] = $order; } $results = wc_get_products($args); $profit_service = new \WooCommersa\Services\Profit_Margin_Service(); $products = []; foreach ($results->products as $p) { $products[] = $this->map_product_data($p); } return [ 'products' => $products, 'total' => intval($results->total), 'pages' => ceil($results->total / $per_page) ]; } /** * Map WC_Product object to array for frontend consumption */ public function map_product_data($p) { $id = $p->get_id(); $profit_service = new \WooCommersa\Services\Profit_Margin_Service(); $settings = get_option('woocommersa_settings', []); // SEO Data Integration via Adapter $seo_title = \WooCommersa\Core\SEOAdapter::get_meta($id, 'title'); $seo_desc = \WooCommersa\Core\SEOAdapter::get_meta($id, 'description'); $seo_key = \WooCommersa\Core\SEOAdapter::get_meta($id, 'keywords'); $seo_robots = \WooCommersa\Core\SEOAdapter::get_meta($id, 'robots'); $seo_redirect = get_post_meta($id, '_woocommersa_redirect_url', true); $seo_redirect_status = get_post_meta($id, '_woocommersa_redirect_status', true) === 'yes'; // Calculate Content Score & Gap Analysis $content = $p->get_description(); $word_count = str_word_count(strip_tags($content)); $has_attributes = count($p->get_attributes()) > 0; $score = 0; if (!empty($seo_title)) $score += 20; if (!empty($seo_desc)) $score += 20; if (!empty($seo_key)) $score += 20; if ($word_count > 300) $score += 20; if ($has_attributes) $score += 20; // Internal Linking Suggestions $cat_ids = $p->get_category_ids(); $internal_links = []; if (!empty($cat_ids)) { $related_ids = wc_get_products(['category' => [$cat_ids[0]], 'exclude' => [$id], 'limit' => 2, 'return' => 'ids']); foreach ($related_ids as $r_id) { $internal_links[] = [ 'id' => $r_id, 'name' => get_the_title($r_id), 'url' => get_permalink($r_id) ]; } } $reg_price = $p->get_regular_price(); $sal_price = $p->get_sale_price(); if ($p->get_type() === 'variable') { $v_prices = $p->get_variation_prices(); $reg_prices = array_unique($v_prices['regular_price']); $sal_prices = array_unique($v_prices['sale_price']); $reg_price = (count($reg_prices) === 1) ? current($reg_prices) : 'قیمت متغیر'; $sal_price = (count($sal_prices) === 1) ? current($sal_prices) : 'قیمت متغیر'; } $parent_id = ($p->get_type() === 'variation') ? $p->get_parent_id() : null; $vendor_name = ''; if (function_exists('dokan_get_store_info')) { $author_id = get_post_field('post_author', $id); if ($author_id) { $vendor_info = dokan_get_store_info($author_id); $vendor_name = $vendor_info['store_name'] ?? get_the_author_meta('display_name', $author_id); } } $brands = \WooCommersa\Services\BrandService::get_instance()->get_product_brand($id); return [ 'id' => $id, 'parent_id' => $parent_id, 'name' => $p->get_name(), 'sku' => $p->get_sku(), 'regular_price' => $reg_price, 'sale_price' => $sal_price, 'stock' => $p->get_stock_quantity(), 'stock_status' => $p->get_stock_status(), 'manage_stock' => $p->get_manage_stock(), 'type' => $p->get_type(), 'status' => $p->get_status(), 'image' => wp_get_attachment_image_url($p->get_image_id(), 'thumbnail'), 'categories' => wp_get_post_terms($id, 'product_cat', ['fields' => 'names']), 'brands' => $brands, 'cost_price' => get_post_meta($id, '_cost_price', true), 'sale_from' => $p->get_date_on_sale_from() ? $p->get_date_on_sale_from()->date('Y-m-d') : '', 'sale_to' => $p->get_date_on_sale_to() ? $p->get_date_on_sale_to()->date('Y-m-d') : '', 'vendor_name' => $vendor_name, 'seo_title' => $seo_title, 'seo_description' => $seo_desc, 'seo_keywords' => $seo_key, 'seo_robots' => $seo_robots, 'seo_redirect' => $seo_redirect, 'seo_redirect_status' => $seo_redirect_status, 'content_score' => $score, 'internal_links' => $internal_links, 'word_count' => $word_count, 'faq_schema' => \WooCommersa\Core\SEOAdapter::get_meta($id, 'faq_schema'), 'product_tags' => wp_get_post_terms($id, 'product_tag', ['fields' => 'names']), 'has_variations' => ($p->get_type() === 'variable' && count($p->get_children()) > 0), 'profit' => get_post_meta($id, '_profit', true) ?: $profit_service->calculate_metrics($id)['profit'], 'margin' => get_post_meta($id, '_margin', true) ?: $profit_service->calculate_metrics($id)['margin'], 'profit_potential' => get_post_meta($id, '_profit_potential', true) ?: $profit_service->calculate_metrics($id)['profit_potential'], 'edit_link' => get_edit_post_link($id, 'raw'), 'view_link' => get_permalink($id), ]; } }