public function screen() { if (!current_user_can('shopp_promotions')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $table = ShoppDatabaseObject::tablename(ShoppPromo::$table); $defaults = array('page' => false, 'status' => false, 'type' => false, 'paged' => 1, 'per_page' => 20, 's' => ''); $args = array_merge($defaults, $_GET); extract($args, EXTR_SKIP); $url = add_query_arg(array_merge($_GET, array('page' => $this->page)), admin_url('admin.php')); $f = array('action', 'selected', 's'); $url = remove_query_arg($f, $url); $pagenum = absint($paged); $start = $per_page * ($pagenum - 1); $where = array(); if (!empty($s)) { $where[] = "name LIKE '%{$s}%'"; } if ($status) { $datesql = ShoppPromo::activedates(); switch (strtolower($status)) { case 'active': $where[] = "status='enabled' AND {$datesql}"; break; case 'inactive': $where[] = "status='enabled' AND NOT {$datesql}"; break; case 'enabled': $where[] = "status='enabled'"; break; case 'disabled': $where[] = "status='disabled'"; break; } } if ($type) { switch (strtolower($type)) { case 'catalog': $where[] = "target='Catalog'"; break; case 'cart': $where[] = "target='Cart'"; break; case 'cartitem': $where[] = "target='Cart Item'"; break; } } $select = sDB::select(array('table' => $table, 'columns' => 'SQL_CALC_FOUND_ROWS *', 'where' => $where, 'orderby' => 'created DESC', 'limit' => "{$start},{$per_page}")); $Promotions = sDB::query($select, 'array'); $count = sDB::found(); $num_pages = ceil($count / $per_page); $ListTable = ShoppUI::table_set_pagination($this->id, $count, $num_pages, $per_page); $states = array('active' => __('Active', 'Shopp'), 'inactive' => __('Not Active', 'Shopp'), 'enabled' => __('Enabled', 'Shopp'), 'disabled' => __('Disabled', 'Shopp')); $types = array('catalog' => __('Catalog Discounts', 'Shopp'), 'cart' => __('Cart Discounts', 'Shopp'), 'cartitem' => __('Cart Item Discounts', 'Shopp')); $num_pages = ceil($count / $per_page); $page_links = paginate_links(array('base' => add_query_arg('pagenum', '%#%'), 'format' => '', 'total' => $num_pages, 'current' => $pagenum)); include $this->ui('discounts.php'); }
public function prepare_items() { $defaults = array('paged' => 1, 'per_page' => 25, 'action' => false, 'selected' => array()); $args = array_merge($defaults, $_GET); extract($args, EXTR_SKIP); $start = $per_page * ($paged - 1); $edit = false; $ImageSetting = new ShoppImageSetting($edit); $table = $ImageSetting->_table; $columns = 'SQL_CALC_FOUND_ROWS *'; $where = array("type='{$ImageSetting->type}'", "context='{$ImageSetting->context}'"); $limit = "{$start},{$per_page}"; $options = compact('columns', 'useindex', 'table', 'joins', 'where', 'groupby', 'having', 'limit', 'orderby'); $query = sDB::select($options); $this->items = sDB::query($query, 'array', array($ImageSetting, 'loader')); $found = sDB::found(); $json = array(); $skip = array('created', 'modified', 'numeral', 'context', 'type', 'sortorder', 'parent'); foreach ($this->items as &$Item) { if (method_exists($Item, 'json')) { $json[$Item->id] = $Item->json($skip); } } shopp_custom_script('imageset', 'var images = ' . json_encode($json) . ';'); $this->set_pagination_args(array('total_items' => $found, 'total_pages' => $found / $per_page, 'per_page' => $per_page)); }
public function screen() { global $wpdb; $defaults = array('page' => false, 'deleting' => false, 'selected' => false, 'update' => false, 'newstatus' => false, 'pagenum' => 1, 'paged' => false, 'per_page' => 20, 'start' => '', 'end' => '', 'status' => false, 's' => '', 'range' => '', 'startdate' => '', 'enddate' => ''); $args = array_merge($defaults, $_GET); extract($args, EXTR_SKIP); if ($page == ShoppAdmin::pagename('customers') && !empty($deleting) && !empty($selected) && is_array($selected) && current_user_can('shopp_delete_customers')) { foreach ($selected as $deletion) { $Customer = new ShoppCustomer($deletion); $Billing = new BillingAddress($Customer->id, 'customer'); $Billing->delete(); $Shipping = new ShippingAddress($Customer->id, 'customer'); $Shipping->delete(); $Customer->delete(); } } $updated = false; // if (!empty($_POST['save'])) { // check_admin_referer('shopp-save-customer'); // $wp_integration = ('wordpress' === shopp_setting( 'account_system' )); // // if ($_POST['id'] !== 'new') { // $Customer = new ShoppCustomer($_POST['id']); // $Billing = new BillingAddress($Customer->id, 'customer'); // $Shipping = new ShippingAddress($Customer->id, 'customer'); // } else $Customer = new ShoppCustomer(); // // if (!empty($Customer->wpuser)) $user = get_user_by('id',$Customer->wpuser); // $new_customer = empty( $Customer->id ); // // $Customer->updates($_POST); // // // Reassign WordPress login // if ($wp_integration && isset($_POST['userlogin']) && $_POST['userlogin'] != $user->user_login) { // $newlogin = get_user_by('login', $_POST['userlogin']); // if ( ! empty($newlogin->ID) ) { // if (sDB::query("SELECT count(*) AS used FROM $Customer->_table WHERE wpuser=$newlogin->ID",'auto','col','used') == 0) { // $Customer->wpuser = $newlogin->ID; // $updated = sprintf(__('Updated customer login to %s.','Shopp'),"<strong>$newlogin->user_login</strong>"); // } else $updated = sprintf(__('Could not update customer login to "%s" because that user is already assigned to another customer.','Shopp'),'<strong>'.sanitize_user($_POST['userlogin']).'</strong>'); // // } else $updated = sprintf(__('Could not update customer login to "%s" because the user does not exist in WordPress.','Shopp'),'<strong>'.sanitize_user($_POST['userlogin']).'</strong>'); // if ( empty($_POST['userlogin']) ) $Customer->wpuser = 0; // } // // if ( ! empty($_POST['new-password']) && !empty($_POST['confirm-password']) // && $_POST['new-password'] == $_POST['confirm-password']) { // $Customer->password = wp_hash_password($_POST['new-password']); // if (!empty($Customer->wpuser)) wp_set_password($_POST['new-password'], $Customer->wpuser); // } // // $valid_email = filter_var( $_POST['email'], FILTER_VALIDATE_EMAIL ); // $password = !empty( $_POST['new_password'] ); // // if ($wp_integration && $new_customer && $valid_email && $password) { // $Customer->loginname = $_POST['userlogin']; // $Customer->email = $_POST['email']; // $Customer->firstname = $_POST['firstname']; // $Customer->lastname = $_POST['lastname']; // // $return = $Customer->create_wpuser(); // // if ( $return ) { // $updated = sprintf( __( 'The Shopp and WordPress accounts have been created with the username "%s".', 'Shopp'), '<strong>'.sanitize_user($_POST['userlogin']).'</strong>'); // } else { // $updated = sprintf( __( 'Could not create a WordPress account for customer "%s".','Shopp'), '<strong>'.sanitize_user($_POST['userlogin']).'</strong>'); // } // } // elseif ($new_customer && ( !$valid_email || !$password ) ) { // $updated = __( 'Could not create new user. You must enter a valid email address and a password first.', 'Shopp' ); // $no_save = true; // } // // if ( !isset( $new_save ) ) { // $Customer->info = false; // No longer used from DB // $Customer->save(); // } // // // if (isset($_POST['info']) && !empty($_POST['info'])) { // foreach ((array)$_POST['info'] as $id => $info) { // $Meta = new ShoppMetaObject($id); // $Meta->value = $info; // $Meta->save(); // } // } // // if (isset($Customer->id)) $Billing->customer = $Customer->id; // $Billing->updates($_POST['billing']); // $Billing->save(); // // if (isset($Customer->id)) $Shipping->customer = $Customer->id; // $Shipping->updates($_POST['shipping']); // $Shipping->save(); // if (!$updated) __('Customer updated.','Shopp'); // $Customer = false; // // } $pagenum = absint($paged); if (empty($pagenum)) { $pagenum = 1; } if (!$per_page || $per_page < 0) { $per_page = 20; } $index = $per_page * ($pagenum - 1); if (!empty($start)) { $startdate = $start; list($month, $day, $year) = explode("/", $startdate); $starts = mktime(0, 0, 0, $month, $day, $year); } if (!empty($end)) { $enddate = $end; list($month, $day, $year) = explode("/", $enddate); $ends = mktime(23, 59, 59, $month, $day, $year); } $customer_table = ShoppDatabaseObject::tablename(Customer::$table); $billing_table = ShoppDatabaseObject::tablename(BillingAddress::$table); $purchase_table = ShoppDatabaseObject::tablename(ShoppPurchase::$table); $users_table = $wpdb->users; $where = array(); if (!empty($s)) { $s = stripslashes($s); if (preg_match_all('/(\\w+?)\\:(?="(.+?)"|(.+?)\\b)/', $s, $props, PREG_SET_ORDER)) { foreach ($props as $search) { $keyword = !empty($search[2]) ? $search[2] : $search[3]; switch (strtolower($search[1])) { case "company": $where[] = "c.company LIKE '%{$keyword}%'"; break; case "login": $where[] = "u.user_login LIKE '%{$keyword}%'"; break; case "address": $where[] = "(b.address LIKE '%{$keyword}%' OR b.xaddress='%{$keyword}%')"; break; case "city": $where[] = "b.city LIKE '%{$keyword}%'"; break; case "province": case "state": $where[] = "b.state='{$keyword}'"; break; case "zip": case "zipcode": case "postcode": $where[] = "b.postcode='{$keyword}'"; break; case "country": $where[] = "b.country='{$keyword}'"; break; } } } elseif (strpos($s, '@') !== false) { $where[] = "c.email='{$s}'"; } elseif (is_numeric($s)) { $where[] = "c.id='{$s}'"; } else { $where[] = "(CONCAT(c.firstname,' ',c.lastname) LIKE '%{$s}%' OR c.company LIKE '%{$s}%')"; } } if (!empty($starts) && !empty($ends)) { $where[] = ' (UNIX_TIMESTAMP(c.created) >= ' . $starts . ' AND UNIX_TIMESTAMP(c.created) <= ' . $ends . ')'; } $select = array('columns' => 'SQL_CALC_FOUND_ROWS c.*,city,state,country,user_login', 'table' => "{$customer_table} as c", 'joins' => array($billing_table => "LEFT JOIN {$billing_table} AS b ON b.customer=c.id AND b.type='billing'", $users_table => "LEFT JOIN {$users_table} AS u ON u.ID=c.wpuser AND (c.wpuser IS NULL OR c.wpuser != 0)"), 'where' => $where, 'groupby' => "c.id", 'orderby' => "c.created DESC", 'limit' => "{$index},{$per_page}"); $query = sDB::select($select); $Customers = sDB::query($query, 'array', 'index', 'id'); $total = sDB::found(); // Add order data to customer records in this view $orders = sDB::query("SELECT customer,SUM(total) AS total,count(id) AS orders FROM {$purchase_table} WHERE customer IN (" . join(',', array_keys($Customers)) . ") GROUP BY customer", 'array', 'index', 'customer'); foreach ($Customers as &$record) { $record->total = 0; $record->orders = 0; if (!isset($orders[$record->id])) { continue; } $record->total = $orders[$record->id]->total; $record->orders = $orders[$record->id]->orders; } $num_pages = ceil($total / $per_page); $ListTable = ShoppUI::table_set_pagination(ShoppAdmin::screen(), $total, $num_pages, $per_page); $ranges = array('all' => __('Show New Customers', 'Shopp'), 'today' => __('Today', 'Shopp'), 'week' => __('This Week', 'Shopp'), 'month' => __('This Month', 'Shopp'), 'quarter' => __('This Quarter', 'Shopp'), 'year' => __('This Year', 'Shopp'), 'yesterday' => __('Yesterday', 'Shopp'), 'lastweek' => __('Last Week', 'Shopp'), 'last30' => __('Last 30 Days', 'Shopp'), 'last90' => __('Last 3 Months', 'Shopp'), 'lastmonth' => __('Last Month', 'Shopp'), 'lastquarter' => __('Last Quarter', 'Shopp'), 'lastyear' => __('Last Year', 'Shopp'), 'lastexport' => __('Last Export', 'Shopp'), 'custom' => __('Custom Dates', 'Shopp')); $exports = array('tab' => __('Tab-separated.txt', 'Shopp'), 'csv' => __('Comma-separated.csv', 'Shopp'), 'xls' => __('Microsoft® Excel.xls', 'Shopp')); $formatPref = shopp_setting('customerexport_format'); if (!$formatPref) { $formatPref = 'tab'; } $columns = array_merge(Customer::exportcolumns(), BillingAddress::exportcolumns(), ShippingAddress::exportcolumns()); $selected = shopp_setting('customerexport_columns'); if (empty($selected)) { $selected = array_keys($columns); } $authentication = shopp_setting('account_system'); $action = add_query_arg(array('page' => ShoppAdmin::pagename('customers')), admin_url('admin.php')); include $this->ui('customers.php'); }
private function __construct() { $ImageSetting = new ShoppImageSetting(); $table = $ImageSetting->_table; $where = array("type='{$ImageSetting->type}'", "context='{$ImageSetting->context}'"); $options = compact('table', 'where'); $query = sDB::select($options); $this->populate(sDB::query($query, 'array', array($ImageSetting, 'loader'), false, 'name')); $this->found = sDB::found(); }
public function images() { if (!current_user_can('shopp_settings')) { wp_die(__('You do not have sufficient permissions to access this page.')); } $defaults = array('paged' => 1, 'per_page' => 25, 'action' => false, 'selected' => array()); $args = array_merge($defaults, $_REQUEST); extract($args, EXTR_SKIP); $edit = false; if (isset($_GET['id'])) { $edit = (int) $_GET['id']; if ('new' == $_GET['id']) { $edit = 'new'; } } if (isset($_GET['delete']) || 'delete' == $action) { check_admin_referer('shopp-settings-images'); if (!empty($_GET['delete'])) { $selected[] = (int) $_GET['delete']; } $selected = array_filter($selected); foreach ($selected as $delete) { $Record = new ImageSetting((int) $delete); $Record->delete(); } } if (!empty($_POST['save'])) { check_admin_referer('shopp-settings-images'); $ImageSetting = new ImageSetting($edit); $_POST['name'] = sanitize_title_with_dashes($_POST['name']); $_POST['sharpen'] = floatval(str_replace('%', '', $_POST['sharpen'])); $ImageSetting->updates($_POST); if (!empty($ImageSetting->name)) { $ImageSetting->save(); } } $start = $per_page * ($paged - 1); $ImageSetting = new ImageSetting($edit); $table = $ImageSetting->_table; $columns = 'SQL_CALC_FOUND_ROWS *'; $where = array("type='{$ImageSetting->type}'", "context='{$ImageSetting->context}'"); $limit = "{$start},{$per_page}"; $options = compact('columns', 'useindex', 'table', 'joins', 'where', 'groupby', 'having', 'limit', 'orderby'); $query = sDB::select($options); $settings = sDB::query($query, 'array', array($ImageSetting, 'loader')); $total = sDB::found(); $num_pages = ceil($total / $per_page); $ListTable = ShoppUI::table_set_pagination($this->screen, $total, $num_pages, $per_page); $fit_menu = $ImageSetting->fit_menu(); $quality_menu = $ImageSetting->quality_menu(); $actions_menu = array('delete' => __('Delete', 'Shopp')); $json_settings = array(); $skip = array('created', 'modified', 'numeral', 'context', 'type', 'sortorder', 'parent'); foreach ($settings as &$Setting) { if (method_exists($Setting, 'json')) { $json_settings[$Setting->id] = $Setting->json($skip); } } include $this->ui('images.php'); }
public function load(array $options = array()) { $thisclass = get_class($this); $slug = isset($this->slug) ? $this->slug : sanitize_key($thisclass); $Storefront = ShoppStorefront(); $Shopping = ShoppShopping(); $Processing = new ShoppProduct(); $summary_table = ShoppDatabaseObject::tablename(ProductSummary::$table); $defaults = array('columns' => false, 'useindex' => false, 'joins' => array(), 'where' => array(), 'groupby' => false, 'orderby' => false, 'having' => array(), 'limit' => false, 'order' => false, 'page' => false, 'paged' => false, 'nostock' => null, 'pagination' => true, 'published' => true, 'ids' => false, 'adjacent' => false, 'product' => false, 'load' => array('coverimages'), 'inventory' => false, 'taxquery' => false, 'debug' => false); $loading = array_merge($defaults, $options); $loading = apply_filters("shopp_collection_load_options", $loading); $loading = apply_filters("shopp_{$slug}_collection_load_options", $loading); extract($loading); // Setup pagination $this->paged = false; $this->pagination = false === $paged ? shopp_setting('catalog_pagination') : $paged; $page = false === $page ? get_query_var('paged') : $page; $this->page = (int) $page > 0 || preg_match('/(0\\-9|[A-Z])/', $page) ? $page : 1; // Hard product limit per category to keep resources "reasonable" $hardlimit = apply_filters('shopp_category_products_hardlimit', 1000); // Enforce the where parameter as an array if (!is_array($where)) { return shopp_debug('The "where" parameter for ' . __METHOD__ . ' must be formatted as an array.'); } // Inventory filtering if (shopp_setting_enabled('inventory') && (is_null($nostock) && !shopp_setting_enabled('outofstock_catalog') || !is_null($nostock) && !Shopp::str_true($nostock))) { $where[] = "( s.inventory='off' OR (s.inventory='on' AND s.stock > 0) )"; } if (Shopp::str_true($published)) { $where[] = "p.post_status='publish'"; } // Multiple taxonomy queries if (is_array($taxquery)) { $tqdefaults = array('relation' => 'AND', 'include_children' => true); $taxquery = array_merge($tqdefaults, $taxquery); $TQ = new WP_Tax_Query($taxquery); $sql = $TQ->get_sql($Processing->_table, 'ID'); unset($TQ); $joins['taxquery'] = self::taxquery($sql['join']); $where[] = self::taxquery($sql['where']); } // Sort Order if (!$orderby) { $titlesort = "p.post_title ASC"; $defaultsort = empty($order) ? $titlesort : $order; // Define filterable built-in sort methods (you're welcome) $sortmethods = apply_filters('shopp_collection_sort_methods', array('bestselling' => "s.sold DESC,{$titlesort}", 'highprice' => "maxprice DESC,{$titlesort}", 'lowprice' => "minprice ASC,{$titlesort}", 'newest' => "p.post_date DESC,{$titlesort}", 'oldest' => "p.post_date ASC,{$titlesort}", 'random' => "RAND(" . crc32($Shopping->session) . ")", 'chaos' => "RAND(" . time() . ")", 'reverse' => "p.post_title DESC", 'title' => $titlesort, 'custom' => is_subclass_of($this, 'ProductTaxonomy') ? "tr.term_order ASC,{$titlesort}" : $defaultsort, 'recommended' => is_subclass_of($this, 'ProductTaxonomy') ? "tr.term_order ASC,{$titlesort}" : $defaultsort, 'default' => $defaultsort)); // Handle valid user browsing sort change requests if (isset($_REQUEST['sort']) && !empty($_REQUEST['sort']) && array_key_exists(strtolower($_REQUEST['sort']), $sortmethods)) { $Storefront->browsing['sortorder'] = strtolower($_REQUEST['sort']); } // Collect sort setting sources (Shopp admin setting, User browsing setting, programmer specified setting) $sortsettings = array(shopp_setting('default_product_order'), isset($Storefront->browsing['sortorder']) ? $Storefront->browsing['sortorder'] : false, !empty($order) ? $order : false); // Go through setting sources to determine most applicable setting $sorting = 'title'; foreach ($sortsettings as $setting) { if (!empty($setting) && isset($sortmethods[strtolower($setting)])) { $sorting = strtolower($setting); } } $orderby = $sortmethods[$sorting]; } if (empty($orderby)) { $orderby = 'p.post_title ASC'; } // Pagination if (empty($limit)) { if ($this->pagination > 0 && is_numeric($this->page) && Shopp::str_true($pagination)) { if (!$this->pagination || $this->pagination < 0) { $this->pagination = $hardlimit; } $start = $this->pagination * ($this->page - 1); $limit = "{$start},{$this->pagination}"; } else { $limit = $hardlimit; } $limited = false; // Flag that the result set does not have forced limits } else { $limited = true; } // The result set has forced limits // Core query components // Load core product data and product summary columns $cols = array('p.ID', 'p.post_title', 'p.post_name', 'p.post_excerpt', 'p.post_status', 'p.post_date', 'p.post_modified', 's.modified AS summed', 's.sold', 's.grossed', 's.maxprice', 's.minprice', 's.ranges', 's.taxed', 's.stock', 's.lowstock', 's.inventory', 's.featured', 's.variants', 's.addons', 's.sale'); if ($ids) { $cols = array('p.ID'); } $columns = "SQL_CALC_FOUND_ROWS " . join(',', $cols) . ($columns !== false ? ',' . $columns : ''); $table = "{$Processing->_table} AS p"; $where[] = "p.post_type='" . ShoppProduct::posttype() . "'"; $joins[$summary_table] = "LEFT OUTER JOIN {$summary_table} AS s ON s.product=p.ID"; $options = compact('columns', 'useindex', 'table', 'joins', 'where', 'groupby', 'having', 'limit', 'orderby'); // Alphabetic pagination if ('alpha' === $pagination || preg_match('/(0\\-9|[A-Z])/', $page)) { // Setup Roman alphabet navigation $alphanav = array_merge(array('0-9'), range('A', 'Z')); $this->alpha = array_combine($alphanav, array_fill(0, count($alphanav), 0)); // Setup alphabetized index query $a = $options; $a['columns'] = "count(DISTINCT p.ID) AS total,IF(LEFT(p.post_title,1) REGEXP '[0-9]',LEFT(p.post_title,1),LEFT(SOUNDEX(p.post_title),1)) AS letter"; $a['groupby'] = "letter"; $alphaquery = sDB::select($a); $cachehash = 'collection_alphanav_' . md5($alphaquery); $cached = Shopp::cache_get($cachehash, 'shopp_collection_alphanav'); if ($cached) { // Load from object cache, if available $this->alpha = $cached; $cached = false; } else { // Run query and cache results $expire = apply_filters('shopp_collection_cache_expire', 43200); $alpha = sDB::query($alphaquery, 'array', array($this, 'alphatable')); Shopp::cache_set($cachehash, $alpha, 'shopp_collection_alphanav', $expire); } $this->paged = true; if ($this->page == 1) { $this->page = '0-9'; } $alphafilter = $this->page == "0-9" ? "(LEFT(p.post_title,1) REGEXP '[0-9]') = 1" : "IF(LEFT(p.post_title,1) REGEXP '[0-9]',LEFT(p.post_title,1),LEFT(SOUNDEX(p.post_title),1))='{$this->page}'"; $options['where'][] = $alphafilter; } $query = sDB::select(apply_filters('shopp_collection_query', $options)); if ($debug) { echo $query . BR . BR; } // Load from cached results if available, or run the query and cache the results $cachehash = 'collection_' . md5($query); $cached = Shopp::cache_get($cachehash, 'shopp_collection'); if ($cached) { $this->products = $cached->products; $this->total = $cached->total; } else { $expire = apply_filters('shopp_collection_cache_expire', 43200); $cache = new stdClass(); if ($ids) { $cache->products = $this->products = sDB::query($query, 'array', 'col', 'ID'); } else { $cache->products = $this->products = sDB::query($query, 'array', array($Processing, 'loader')); } $cache->total = $this->total = sDB::found(); // If running a limited set, the reported total found should not exceed the limit (but can because of SQL_CALC_FOUND_ROWS) // Don't use the limit if it is offset if ($limited && false === strpos($limit, ',')) { $cache->total = $this->total = min($limit, $this->total); } Shopp::cache_set($cachehash, $cache, 'shopp_collection', $expire); } if (false === $this->products) { $this->products = array(); } if ($ids) { return $this->size() > 0; } // Finish up pagination construction if ($this->pagination > 0 && $this->total > $this->pagination) { $this->pages = ceil($this->total / $this->pagination); if ($this->pages > 1) { $this->paged = true; } } // Load all requested product meta from other data sources $Processing->load_data($load, $this->products); // If products are missing summary data, resum them if (isset($Processing->resum) && !empty($Processing->resum)) { $Processing->load_data(array('prices'), $Processing->resum); } unset($Processing); // Free memory $this->loaded = true; return $this->size() > 0; }
public function loader($workflow = false) { if (!current_user_can('shopp_products')) { return; } add_screen_option('per_page', array('label' => __('Products Per Page', 'Shopp'), 'default' => 20, 'option' => 'edit_' . ShoppProduct::$posttype . '_per_page')); $per_page_option = get_current_screen()->get_option('per_page'); $defaults = array('cat' => false, 'paged' => 1, 'per_page' => $per_page_option['default'], 's' => '', 'sl' => '', 'matchcol' => '', 'view' => $this->view, 'is_inventory' => false, 'is_trash' => false, 'is_bestselling' => false, 'categories_menu' => false, 'inventory_menu' => false, 'lowstock' => 0, 'columns' => '', 'orderby' => '', 'order' => '', 'where' => array(), 'joins' => array()); $args = array_merge($defaults, $_GET); if (false !== ($user_per_page = get_user_option($per_page_option['option']))) { $args['per_page'] = $user_per_page; } extract($args, EXTR_SKIP); $url = ShoppAdminController::url($_GET); $subs = array('all' => array('label' => Shopp::__('All'), 'where' => array("p.post_status!='trash'")), 'published' => array('label' => Shopp::__('Published'), 'where' => array("p.post_status='publish'")), 'drafts' => array('label' => Shopp::__('Drafts'), 'where' => array("p.post_status='draft'")), 'onsale' => array('label' => Shopp::__('On Sale'), 'where' => array("s.sale='on' AND p.post_status != 'trash'")), 'featured' => array('label' => Shopp::__('Featured'), 'where' => array("s.featured='on' AND p.post_status != 'trash'")), 'bestselling' => array('label' => Shopp::__('Bestselling'), 'where' => array("p.post_status!='trash'", BestsellerProducts::threshold() . " < s.sold"), 'order' => 'bestselling'), 'inventory' => array('label' => Shopp::__('Inventory'), 'where' => array("s.inventory='on' AND p.post_status != 'trash'")), 'trash' => array('label' => Shopp::__('Trash'), 'where' => array("p.post_status='trash'"))); if (!shopp_setting_enabled('inventory')) { unset($subs['inventory']); } switch ($view) { case 'inventory': if (shopp_setting_enabled('inventory')) { $is_inventory = true; } else { Shopp::redirect(add_query_arg('view', null, $url), true); } break; case 'trash': $is_trash = true; break; case 'bestselling': $is_bestselling = true; break; } if ($is_inventory) { $per_page = 50; } $pagenum = absint($paged); $start = $per_page * ($pagenum - 1); $where = $subs[$this->view]['where']; if (!empty($s)) { $SearchResults = new SearchResults(array('search' => $s, 'nostock' => 'on', 'published' => 'off', 'paged' => -1)); $SearchResults->load(); $ids = array_keys($SearchResults->products); $where[] = "p.ID IN (" . join(',', $ids) . ")"; } if (!empty($cat)) { global $wpdb; $joins[$wpdb->term_relationships] = "INNER JOIN {$wpdb->term_relationships} AS tr ON (p.ID=tr.object_id)"; $joins[$wpdb->term_taxonomy] = "INNER JOIN {$wpdb->term_taxonomy} AS tt ON (tr.term_taxonomy_id=tt.term_taxonomy_id AND tt.term_id={$cat})"; if (-1 == $cat) { unset($joins[$wpdb->term_taxonomy]); $joins[$wpdb->term_relationships] = "LEFT JOIN {$wpdb->term_relationships} AS tr ON (p.ID=tr.object_id)"; $where[] = 'tr.object_id IS NULL'; } } // Detect custom taxonomies $taxonomies = array_intersect(get_object_taxonomies(ShoppProduct::$posttype), array_keys($_GET)); if (!empty($taxonomies)) { foreach ($taxonomies as $n => $taxonomy) { global $wpdb; $term = get_term_by('slug', $_GET[$taxonomy], $taxonomy); if (!empty($term->term_id)) { $joins[$wpdb->term_relationships . '_' . $n] = "INNER JOIN {$wpdb->term_relationships} AS tr{$n} ON (p.ID=tr{$n}.object_id)"; $joins[$wpdb->term_taxonomy . '_' . $n] = "INNER JOIN {$wpdb->term_taxonomy} AS tt{$n} ON (tr{$n}.term_taxonomy_id=tt{$n}.term_taxonomy_id AND tt{$n}.term_id={$term->term_id})"; } } } if (!empty($sl) && shopp_setting_enabled('inventory')) { switch ($sl) { case "ns": foreach ($where as &$w) { $w = str_replace("s.inventory='on'", "s.inventory='off'", $w); } $where[] = "s.inventory='off'"; break; case "oos": $where[] = "(s.inventory='on' AND s.stock = 0)"; break; case "ls": $ls = shopp_setting('lowstock_level'); if (empty($ls)) { $ls = '0'; } $where[] = "(s.inventory='on' AND s.lowstock != 'none')"; break; case "is": $where[] = "(s.inventory='on' AND s.stock > 0)"; } } $lowstock = shopp_setting('lowstock_level'); // Setup queries $pd = WPDatabaseObject::tablename(ShoppProduct::$table); $pt = ShoppDatabaseObject::tablename(ShoppPrice::$table); $ps = ShoppDatabaseObject::tablename(ProductSummary::$table); $orderdirs = array('asc', 'desc'); if (in_array($order, $orderdirs)) { $orderd = strtolower($order); } else { $orderd = 'asc'; } if (isset($subs[$this->view]['order'])) { $order = $subs[$this->view]['order']; } $ordercols = ''; switch ($orderby) { case 'name': $order = 'title'; if ('desc' == $orderd) { $order = 'reverse'; } break; case 'price': $order = 'lowprice'; if ('desc' == $orderd) { $order = 'highprice'; } break; case 'date': $order = 'newest'; if ('desc' == $orderd) { $order = 'oldest'; } break; case 'sold': $ordercols = 's.sold ' . $orderd; break; case 'gross': $ordercols = 's.grossed ' . $orderd; break; case 'inventory': $ordercols = 's.stock ' . $orderd; break; case 'sku': $ordercols = 'pt.sku ' . $orderd; break; } if (in_array($this->view, array('onsale', 'featured', 'inventory'))) { $joins[$ps] = "INNER JOIN {$ps} AS s ON p.ID=s.product"; } $loading = array('where' => $where, 'joins' => $joins, 'limit' => "{$start},{$per_page}", 'load' => array('categories', 'coverimages'), 'published' => false, 'order' => $order, 'nostock' => true); if (!empty($ordercols)) { unset($loading['order']); $loading['orderby'] = $ordercols; } if ($is_inventory) { // Override for inventory products $where[] = "(pt.context='product' OR pt.context='variation') AND pt.type != 'N/A'"; $loading = array('columns' => "pt.id AS stockid,IF(pt.context='variation',CONCAT(p.post_title,': ',pt.label),p.post_title) AS post_title,pt.sku AS sku,pt.stock AS stock", 'joins' => array_merge(array($pt => "LEFT JOIN {$pt} AS pt ON p.ID=pt.product"), $joins), 'where' => $where, 'groupby' => 'pt.id', 'orderby' => str_replace('s.', 'pt.', $ordercols), 'limit' => "{$start},{$per_page}", 'nostock' => true, 'published' => false); } // Override loading product meta and limiting by pagination in the workflow list if ($workflow) { unset($loading['limit']); $loading['ids'] = true; $loading['pagination'] = false; $loading['load'] = array(); } $this->products = new ProductCollection(); $this->products->load($loading); // Overpagination protection, redirect to page 1 if the requested page doesn't exist $num_pages = ceil($this->products->total / $per_page); if ($paged > 1 && $paged > $num_pages) { Shopp::redirect(add_query_arg('paged', null, $url)); } // Return a list of product keys for workflow list requests if ($workflow) { return $this->products->worklist(); } // Get sub-screen counts $subcounts = Shopp::cache_get('shopp_product_subcounts', 'shopp_admin'); if ($subcounts) { foreach ($subcounts as $name => $total) { if (isset($subs[$name])) { $subs[$name]['total'] = $total; } } } else { $subcounts = array(); foreach ($subs as $name => &$subquery) { $subquery['total'] = 0; $query = array('columns' => "count(*) AS total", 'table' => "{$pd} as p", 'joins' => array(), 'where' => array()); $query = array_merge($query, $subquery); $query['where'][] = "p.post_type='shopp_product'"; if (in_array($name, array('onsale', 'bestselling', 'featured', 'inventory'))) { $query['joins'][$ps] = "INNER JOIN {$ps} AS s ON p.ID=s.product"; } $query = sDB::select($query); $subquery['total'] = sDB::query($query, 'auto', 'col', 'total'); $subcounts[$name] = $subquery['total']; } Shopp::cache_set('shopp_product_subcounts', $subcounts, 'shopp_admin'); } $this->subs = $subs; }
public function select_customer() { check_admin_referer('wp_ajax_shopp_select_customer'); $defaults = array('page' => false, 'paged' => 1, 'per_page' => 7, 'status' => false, 's' => ''); $args = wp_parse_args($_REQUEST, $defaults); extract($args, EXTR_SKIP); if (!empty($s)) { $s = stripslashes($s); $search = sDB::escape($s); $where = array(); if (preg_match_all('/(\\w+?)\\:(?="(.+?)"|(.+?)\\b)/', $s, $props, PREG_SET_ORDER)) { foreach ($props as $search) { $keyword = !empty($search[2]) ? $search[2] : $search[3]; switch (strtolower($search[1])) { case "company": $where[] = "c.company LIKE '%{$keyword}%'"; break; case "login": $where[] = "u.user_login LIKE '%{$keyword}%'"; break; case "address": $where[] = "(b.address LIKE '%{$keyword}%' OR b.xaddress='%{$keyword}%')"; break; case "city": $where[] = "b.city LIKE '%{$keyword}%'"; break; case "province": case "state": $where[] = "b.state='{$keyword}'"; break; case "zip": case "zipcode": case "postcode": $where[] = "b.postcode='{$keyword}'"; break; case "country": $where[] = "b.country='{$keyword}'"; break; } } } elseif (strpos($s, '@') !== false) { $where[] = "c.email LIKE '%{$search}%'"; } elseif (is_numeric($s)) { $where[] = "c.phone='{$search}'"; } else { $where[] = "(CONCAT(c.firstname,' ',c.lastname) LIKE '%{$search}%' OR c.company LIKE '%{$s}%' OR u.user_login LIKE '%{$s}%')"; } $pagenum = absint($paged); if (empty($pagenum)) { $pagenum = 1; } $index = $per_page * ($pagenum - 1); $customer_table = ShoppDatabaseObject::tablename(Customer::$table); $billing_table = ShoppDatabaseObject::tablename(BillingAddress::$table); $purchase_table = ShoppDatabaseObject::tablename(ShoppPurchase::$table); global $wpdb; $users_table = $wpdb->users; $select = array('columns' => 'SQL_CALC_FOUND_ROWS c.*,city,state,country,user_login', 'table' => "{$customer_table} as c", 'joins' => array($billing_table => "LEFT JOIN {$billing_table} AS b ON b.customer=c.id AND b.type='billing'", $users_table => "LEFT JOIN {$users_table} AS u ON u.ID=c.wpuser AND (c.wpuser IS NULL OR c.wpuser != 0)"), 'where' => $where, 'groupby' => "c.id", 'orderby' => "c.created DESC", 'limit' => "{$index},{$per_page}"); $query = sDB::select($select); } // if (!empty($starts) && !empty($ends)) $where[] = ' (UNIX_TIMESTAMP(c.created) >= '.$starts.' AND UNIX_TIMESTAMP(c.created) <= '.$ends.')'; $list = sDB::query($query, 'array', 'index', 'id'); $results = array(); foreach ($list as $entry) { $results[] = array('id' => $entry->id, 'user' => $entry->user, 'gravatar' => get_avatar($entry->email, 32), 'firstname' => $entry->firstname, 'lastname' => $entry->lastname, 'company' => $entry->company, 'email' => $entry->email, 'lastname' => $entry->lastname, 'phone' => $entry->phone); } header('Content-Type: application/json; charset=utf-8'); echo json_encode($results); exit; $url = admin_url('admin-ajax.php'); ?> <html> <head> <link rel="stylesheet" id="wp-admin" href="<?php echo admin_url('css/wp-admin.css'); ?> " type="text/css" media="all" /> <link rel="stylesheet" id="shopp-admin" href="<?php echo SHOPP_ADMIN_URI . '/styles/admin.css'; ?> " type="text/css" media="all" /> </head> <body id="customer-select"> <?php if (!empty($Customers)) { ?> <ul> <?php foreach ($Customers as $Customer) { ?> <li><a href="<?php echo add_query_arg(array('order-action' => 'change-customer', 'page' => $_GET['page'], 'id' => (int) $_GET['id'], 'customerid' => $Customer->id), admin_url('admin.php')); ?> " target="_parent"> <?php $wp_user = get_userdata($Customer->wpuser); $userlink = add_query_arg('user_id', $Customer->wpuser, admin_url('user-edit.php')); echo get_avatar($Customer->wpuser, 48); ?> <?php echo "<strong>{$Customer->firstname} {$Customer->lastname}</strong>"; if (!empty($Customer->company)) { echo ", {$Customer->company}"; } ?> <?php if (!empty($Customer->email)) { echo "<br />{$Customer->email}"; } ?> <?php if (!empty($Customer->phone)) { echo "<br />{$Customer->phone}"; } ?> </a> </li> <?php } ?> </ul> <?php } else { ?> <?php _e('No customers found.', 'Shopp'); ?> <?php } ?> </body> </html> <?php exit; }
/** * Load active promotions * * @author Jonathan Davis * @since 1.3 * * @return array List of loaded ShoppOrderPromo objects **/ public function load() { if ($this->loaded) { return; } // Don't load twice in one request $table = ShoppDatabaseObject::tablename(ShoppPromo::$table); $where = array("status='enabled'", ShoppPromo::activedates(), "target IN ('" . join("','", self::$targets) . "')"); $orderby = 'target DESC'; $queryargs = compact('table', 'where', 'orderby'); $query = sDB::select($queryargs); $loaded = sDB::query($query, 'array', array('ShoppPromotions', 'loader')); if (!$loaded || 0 == count($loaded)) { return; } $this->populate($loaded); $this->loaded = true; }
/** * Registers the Shopp Collections meta box in the WordPress theme menus screen * * @author Jonathan Davis * @since 1.2 * * @return void **/ public static function shopp_collections_meta_box() { global $_nav_menu_placeholder, $nav_menu_selected_id; $Shopp = Shopp::object(); $removed_args = array('action', 'customlink-tab', 'edit-menu-item', 'menu-item', 'page-tab', '_wpnonce'); ?> <br /> <div class="shopp-collections-menu-item customlinkdiv" id="shopp-collections-menu-item"> <div id="tabs-panel-shopp-collections" class="tabs-panel tabs-panel-active"> <ul class="categorychecklist form-no-clear"> <?php $collections = $Shopp->Collections; foreach ($collections as $slug => $CollectionClass) { $menu = get_class_property($CollectionClass, '_menu'); if (!$menu) { continue; } $Collection = new $CollectionClass(); $Collection->smart(); $_nav_menu_placeholder = 0 > $_nav_menu_placeholder ? $_nav_menu_placeholder - 1 : -1; ?> <li> <label class="menu-item-title"> <input type="checkbox" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-shopp-collection]" value="<?php echo $slug; ?> " class="menu-item-checkbox" /> <?php echo esc_html($Collection->name); ?> </label> <input type="hidden" class="menu-item-db-id" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-db-id]" value="0" /> <input type="hidden" class="menu-item-object-id" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-object-id]" value="<?php echo $slug; ?> " /> <input type="hidden" class="menu-item-object" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-object]" value="<?php echo $slug; ?> " /> <input type="hidden" class="menu-item-parent-id" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-parent-id]" value="0"> <input type="hidden" class="menu-item-type" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-type]" value="<?php echo SmartCollection::$taxon; ?> " /> <input type="hidden" class="menu-item-title" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-title]" value="<?php echo $Collection->name; ?> " /> </li> <?php } ?> <?php // Promo Collections $select = sDB::select(array('table' => ShoppDatabaseObject::tablename(ShoppPromo::$table), 'columns' => 'SQL_CALC_FOUND_ROWS id,name', 'where' => array("target='Catalog'", "status='enabled'"), 'orderby' => 'created DESC')); $Promotions = sDB::query($select, 'array'); foreach ($Promotions as $promo) { $slug = sanitize_title_with_dashes($promo->name); ?> <li> <label class="menu-item-title"> <input type="checkbox" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-shopp-collection]" value="<?php echo $slug; ?> " class="menu-item-checkbox" /> <?php echo esc_html($promo->name); ?> </label> <input type="hidden" class="menu-item-db-id" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-db-id]" value="0" /> <input type="hidden" class="menu-item-object-id" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-object-id]" value="<?php echo $slug; ?> " /> <input type="hidden" class="menu-item-object" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-object]" value="<?php echo $slug; ?> " /> <input type="hidden" class="menu-item-parent-id" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-parent-id]" value="0"> <input type="hidden" class="menu-item-type" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-type]" value="<?php echo SmartCollection::$taxon; ?> " /> <input type="hidden" class="menu-item-title" name="menu-item[<?php echo $_nav_menu_placeholder; ?> ][menu-item-title]" value="<?php echo $promo->name; ?> " /> </li> <?php } ?> </ul> </div> <p class="button-controls"> <span class="list-controls"> <a href="<?php echo esc_url(add_query_arg(array('shopp-pages-menu-item' => 'all', 'selectall' => 1), remove_query_arg($removed_args))); ?> #shopp-collections-menu-item" class="select-all"><?php _e('Select All'); ?> </a> </span> <span class="add-to-menu"> <span class="spinner"></span> <input type="submit"<?php disabled($nav_menu_selected_id, 0); ?> class="button-secondary submit-add-to-menu" value="<?php esc_attr_e('Add to Menu'); ?> " name="add-shopp-menu-item" id="submit-shopp-collections-menu-item" /> </span> </p> </div><!-- /.customlinkdiv --> <?php }
public function images() { $settings = array('gallery-previews' => array('fit' => 'all', 'size' => 240, 'quality' => 100), 'gallery-thumbnails' => array('fit' => 'all', 'size' => 64, 'quality' => 100), 'thumbnails' => array('fit' => 'all', 'size' => 96, 'quality' => 100)); // Determine if any of the default settings exist to prevent overwriting changes $defaults = array_keys($settings); $ImageSetting = new ShoppImageSetting(); $options = array('columns' => 'name', 'table' => $ImageSetting->_table, 'where' => array("type='{$ImageSetting->type}'", "context='{$ImageSetting->context}'", "name IN ('" . join("', '", $defaults) . "')"), 'limit' => count($defaults)); $query = sDB::select($options); $existing = sDB::query($query, 'array', 'col', 'name'); // Get the settings that need setup $setup = array_diff($defaults, $existing); foreach ($setup as $setting) { shopp_set_image_setting($setting, $settings[$setting]); } }
" /> <input type="hidden" class="menu-item-title" name="menu-item[<?php echo $navmenu_placeholder; ?> ][menu-item-title]" value="<?php echo $Collection->name; ?> " /> </li> <?php } ?> <?php // Promo Collections $select = sDB::select(array('table' => ShoppDatabaseObject::tablename(ShoppPromo::$table), 'columns' => 'SQL_CALC_FOUND_ROWS id,name', 'where' => array("target='Catalog'", "status='enabled'"), 'orderby' => 'created DESC')); $Promotions = sDB::query($select, 'array'); foreach ((array) $Promotions as $promo) { $slug = sanitize_title_with_dashes($promo->name); ?> <li> <label class="menu-item-title"> <input type="checkbox" name="menu-item[<?php echo $navmenu_placeholder; ?> ][menu-item-shopp-collection]" value="<?php echo $slug; ?> " class="menu-item-checkbox" /> <?php echo esc_html($promo->name); ?>