cms = 'WordPress';
$this->name = 'woocommerce';
if (!file_exists($this->pluginsPath.'woocommerce')) {
$this->installed = false;
}
$this->rootCategoryId = 0;
}
function insertOptions()
{
$plugin = new stdClass();
$plugin->name = 'WooCommerce';
$plugin->icon = ACYM_DYNAMICS_URL.basename(__DIR__).'/icon.png';
$plugin->plugin = __CLASS__;
return $plugin;
}
function contentPopup()
{
$this->categories = acym_loadObjectList(
"SELECT cat.term_taxonomy_id AS id, cat.parent AS parent_id, catdetails.name AS title
FROM `#__term_taxonomy` AS cat
JOIN `#__terms` AS catdetails ON cat.term_id = catdetails.term_id
WHERE cat.taxonomy = 'product_cat'"
);
$wooCategories = [];
foreach ($this->categories as $oneCat) {
$wooCategories[$oneCat->id] = $oneCat->title;
}
$tabHelper = acym_get('helper.tab');
$tabHelper->startTab(acym_translation('ACYM_ONE_BY_ONE'));
$displayOptions = [
[
'title' => 'ACYM_DISPLAY',
'type' => 'checkbox',
'name' => 'display',
'options' => [
'title' => ['ACYM_TITLE', true],
'price' => ['ACYM_PRICE', true],
'desc' => ['ACYM_DESCRIPTION', true],
'shortdesc' => ['ACYM_SHORT_DESCRIPTION', false],
'cats' => ['ACYM_CATEGORIES', false],
'attribs' => ['ACYM_DETAILS', false],
],
],
[
'title' => 'ACYM_CLICKABLE_TITLE',
'type' => 'boolean',
'name' => 'clickable',
'default' => true,
],
[
'title' => 'ACYM_TRUNCATE',
'type' => 'intextfield',
'name' => 'wrap',
'text' => 'ACYM_TRUNCATE_AFTER',
'default' => 0,
],
[
'title' => 'ACYM_DISPLAY_PICTURES',
'type' => 'pictures',
'name' => 'pictures',
],
];
echo $this->acympluginHelper->displayOptions($displayOptions, $this->name);
echo $this->getFilteringZone();
$this->displayListing();
$tabHelper->endTab();
$tabHelper->startTab(acym_translation('ACYM_BY_CATEGORY'));
$catOptions = [
[
'title' => 'ACYM_ORDER_BY',
'type' => 'select',
'name' => 'order',
'options' => [
'ID' => 'ACYM_ID',
'post_date' => 'ACYM_PUBLISHING_DATE',
'post_modified' => 'ACYM_MODIFICATION_DATE',
'post_title' => 'ACYM_TITLE',
'rand' => 'ACYM_RANDOM',
],
],
[
'title' => 'ACYM_COLUMNS',
'type' => 'text',
'name' => 'cols',
'default' => 1,
],
[
'title' => 'ACYM_MAX_NB_ELEMENTS',
'type' => 'text',
'name' => 'max',
'default' => 20,
],
];
$displayOptions = array_merge($displayOptions, $catOptions);
echo $this->acympluginHelper->displayOptions($displayOptions, 'auto'.$this->name, 'grouped');
echo $this->getCategoryListing();
$tabHelper->endTab();
$tabHelper->startTab(acym_translation('ACYM_COUPON'));
$displayOptions = [
[
'title' => 'ACYM_DISCOUNT_CODE',
'type' => 'text',
'name' => 'code',
'default' => '[name][key][value]',
'class' => 'acym_plugin__larger_text_field',
],
[
'title' => __('Coupon expiry date', 'woocommerce'),
'type' => 'date',
'name' => 'end',
'default' => '',
],
[
'title' => __('Discount type', 'woocommerce'),
'type' => 'select',
'name' => 'type',
'options' => [
'fixed_cart' => __('Fixed cart discount', 'woocommerce'),
'fixed_product' => __('Fixed product discount', 'woocommerce'),
'percent' => __('Percentage discount', 'woocommerce'),
],
],
[
'title' => __('Coupon amount', 'woocommerce'),
'type' => 'number',
'name' => 'amount',
'default' => '0',
],
[
'title' => __('Allow free shipping', 'woocommerce'),
'type' => 'boolean',
'name' => 'free',
'default' => false,
],
[
'title' => __('Exclude sale items', 'woocommerce'),
'type' => 'boolean',
'name' => 'exclsale',
'default' => false,
],
[
'title' => __('Minimum spend', 'woocommerce'),
'type' => 'number',
'name' => 'min',
'default' => '',
],
[
'title' => __('Maximum spend', 'woocommerce'),
'type' => 'number',
'name' => 'max',
'default' => '',
],
[
'title' => __('Usage limit per coupon', 'woocommerce'),
'type' => 'number',
'name' => 'use',
'default' => '1',
],
[
'title' => __('Limit usage to X items', 'woocommerce'),
'type' => 'number',
'name' => 'items',
'default' => '',
],
[
'title' => __('Products', 'woocommerce'),
'type' => 'text',
'name' => 'prod',
'class' => 'acym_plugin__larger_text_field',
'default' => '',
],
[
'title' => __('Exclude products', 'woocommerce'),
'type' => 'text',
'name' => 'exclprod',
'class' => 'acym_plugin__larger_text_field',
'default' => '',
],
[
'title' => __('Product categories', 'woocommerce'),
'type' => 'multiselect',
'name' => 'cat',
'options' => $wooCategories,
],
[
'title' => __('Exclude categories', 'woocommerce'),
'type' => 'multiselect',
'name' => 'exclcat',
'options' => $wooCategories,
],
];
echo $this->acympluginHelper->displayOptions($displayOptions, $this->name.'_coupon', 'simple', '');
$tabHelper->endTab();
$tabHelper->display('plugin');
}
function displayListing()
{
$query = 'SELECT SQL_CALC_FOUND_ROWS product.ID, product.post_title, product.post_date FROM #__posts AS product ';
$filters = [];
$this->pageInfo = new stdClass();
$this->pageInfo->limit = acym_getCMSConfig('list_limit');
$this->pageInfo->page = acym_getVar('int', 'pagination_page_ajax', 1);
$this->pageInfo->start = ($this->pageInfo->page - 1) * $this->pageInfo->limit;
$this->pageInfo->search = acym_getVar('string', 'plugin_search', '');
$this->pageInfo->filter_cat = acym_getVar('int', 'plugin_category', 0);
$this->pageInfo->order = 'product.ID';
$this->pageInfo->orderdir = 'DESC';
$searchFields = ['product.ID', 'product.post_title'];
if (!empty($this->pageInfo->search)) {
$searchVal = '%'.acym_getEscaped($this->pageInfo->search, true).'%';
$filters[] = implode(" LIKE ".acym_escapeDB($searchVal)." OR ", $searchFields)." LIKE ".acym_escapeDB($searchVal);
}
if (!empty($this->pageInfo->filter_cat)) {
$query .= 'JOIN #__term_relationships AS cat ON product.ID = cat.object_id';
$filters[] = "cat.term_taxonomy_id = ".intval($this->pageInfo->filter_cat);
}
$filters[] = 'product.post_type = "product"';
$filters[] = 'product.post_status = "publish"';
$query .= ' WHERE ('.implode(') AND (', $filters).')';
if (!empty($this->pageInfo->order)) $query .= ' ORDER BY '.acym_secureDBColumn($this->pageInfo->order).' '.acym_secureDBColumn($this->pageInfo->orderdir);
$rows = acym_loadObjectList($query, '', $this->pageInfo->start, $this->pageInfo->limit);
$this->pageInfo->total = acym_loadResult('SELECT FOUND_ROWS()');
$listingOptions = [
'header' => [
'post_title' => [
'label' => 'ACYM_TITLE',
'size' => '5',
],
'post_date' => [
'label' => 'ACYM_DATE_CREATED',
'size' => '3',
'type' => 'date',
],
'ID' => [
'label' => 'ACYM_ID',
'size' => '1',
'class' => 'text-center',
],
],
'id' => 'ID',
'rows' => $rows,
];
echo $this->getElementsListing($listingOptions);
}
function replaceContent(&$email)
{
$this->_replaceAuto($email);
$this->_replaceOne($email);
}
function _replaceAuto(&$email)
{
$this->generateByCategory($email);
if (empty($this->tags)) {
return;
}
$this->acympluginHelper->replaceTags($email, $this->tags, true);
}
function generateByCategory(&$email)
{
$tags = $this->acympluginHelper->extractTags($email, 'auto'.$this->name);
$return = new stdClass();
$return->status = true;
$return->message = '';
$this->tags = [];
if (empty($tags)) {
return $return;
}
foreach ($tags as $oneTag => $parameter) {
if (isset($this->tags[$oneTag])) {
continue;
}
$allcats = explode('-', $parameter->id);
$selectedArea = [];
foreach ($allcats as $oneCat) {
if (empty($oneCat)) {
continue;
}
$selectedArea[] = intval($oneCat);
}
$query = 'SELECT DISTINCT product.`ID`
FROM #__posts AS product
LEFT JOIN #__term_relationships AS cat ON product.ID = cat.object_id';
$where = [];
if (!empty($selectedArea)) {
$where[] = 'cat.term_taxonomy_id IN ('.implode(',', $selectedArea).')';
}
$where[] = 'product.post_type = "product"';
$where[] = 'product.post_status = "publish"';
$query .= ' WHERE ('.implode(') AND (', $where).')';
if (!empty($parameter->order)) {
$ordering = explode(',', $parameter->order);
if ($ordering[0] == 'rand') {
$query .= ' ORDER BY rand()';
} else {
$query .= ' ORDER BY product.`'.acym_secureDBColumn(trim($ordering[0])).'` '.acym_secureDBColumn(trim($ordering[1]));
}
}
if (empty($parameter->max)) $parameter->max = 20;
$query .= ' LIMIT '.intval($parameter->max);
$allArticles = acym_loadResultArray($query);
$this->tags[$oneTag] = $this->finalizeCategoryFormat($this->name, $allArticles, $parameter);
}
return $return;
}
private function _replaceOne(&$email)
{
$tags = $this->acympluginHelper->extractTags($email, $this->name);
if (empty($tags)) return;
$tagsReplaced = [];
foreach ($tags as $i => $oneTag) {
if (isset($tagsReplaced[$i])) {
continue;
}
$tagsReplaced[$i] = $this->_replaceContent($oneTag, $email);
}
$this->acympluginHelper->replaceTags($email, $tagsReplaced, true);
}
function _replaceContent($tag, &$email)
{
$query = 'SELECT product.*
FROM #__posts AS product
WHERE product.post_type = "product"
AND product.post_status = "publish"
AND product.ID = '.intval($tag->id);
$element = acym_loadObject($query);
$product = wc_get_product($tag->id);
if (empty($element) || empty($product)) {
if (acym_isAdmin()) {
acym_enqueueMessage('The product "'.$tag->id.'" could not be found', 'notice');
}
return '';
}
if (empty($tag->display)) {
$tag->display = [];
} else {
$tag->display = explode(',', $tag->display);
}
$varFields = [];
foreach ($element as $fieldName => $oneField) {
$varFields['{'.$fieldName.'}'] = $oneField;
}
$link = $element->guid;
$varFields['{link}'] = $link;
$title = $element->post_title;
$afterTitle = '';
if (in_array('price', $tag->display)) {
$afterTitle .= $product->get_price_html();
}
$imagePath = '';
if (!empty($tag->pict)) {
$imageHTML = $product->get_image('full');
if (!empty($imageHTML)) {
$posURL = strpos($imageHTML, ' src="') + 6;
$imagePath = substr($imageHTML, $posURL, strpos($imageHTML, '"', $posURL) - $posURL);
}
}
$contentText = '';
if (in_array('desc', $tag->display)) $contentText .= $element->post_content;
if (in_array('shortdesc', $tag->display)) $contentText .= $element->post_excerpt;
$customFields = [];
if (in_array('cats', $tag->display)) {
$customFields[] = [
get_the_term_list($tag->id, 'product_cat', '', ', '),
acym_translation('ACYM_CATEGORIES'),
];
}
if (in_array('attribs', $tag->display)) {
$attributes = acym_loadResult('SELECT meta_value FROM #__postmeta WHERE meta_key = "_product_attributes" AND post_id = '.intval($tag->id));
if (is_string($attributes)) {
$attributes = unserialize($attributes);
if (!empty($attributes)) {
foreach ($attributes as $oneAttribute) {
if ($oneAttribute['is_visible'] != 1) continue;
$customFields[] = [
str_replace('|', ', ', $oneAttribute['value']),
$oneAttribute['name'],
];
}
}
}
}
$format = new stdClass();
$format->tag = $tag;
$format->title = $title;
$format->afterTitle = $afterTitle;
$format->afterArticle = '';
$format->imagePath = $imagePath;
$format->description = $contentText;
$format->link = empty($tag->clickable) ? '' : $link;
$format->cols = empty($tag->nbcols) ? 1 : intval($tag->nbcols);
$format->customFields = $customFields;
$result = '
'.$this->acympluginHelper->getStandardDisplay($format).'
';
return $this->finalizeElementFormat($this->name, $result, $tag, $varFields);
}
public function replaceUserInformation(&$email, &$user, $send = true)
{
$this->_replaceCoupons($email, $user, $send);
}
private function _replaceCoupons(&$email, &$user, $send = true)
{
$tags = $this->acympluginHelper->extractTags($email, 'woocommerce_coupon');
if (empty($tags)) {
return;
}
$tagsReplaced = [];
foreach ($tags as $i => $oneTag) {
if (isset($tagsReplaced[$i])) {
continue;
}
if (!$send || empty($user->id)) {
$tagsReplaced[$i] = ''.acym_translation('ACYM_CHECK_EMAIL_COUPON').' ';
} else {
$tagsReplaced[$i] = $this->generateCoupon($oneTag, $user);
}
}
$this->acympluginHelper->replaceTags($email, $tagsReplaced, true);
}
private function generateCoupon($tag, $user)
{
if (empty($tag->code) || empty($tag->amount) || empty($tag->type) || !in_array($tag->type, ['fixed_cart', 'fixed_product', 'percent'])) return '';
$intAttributes = ['amount', 'free', 'min', 'max', 'exclsale', 'use', 'items'];
foreach ($intAttributes as $oneAttribute) {
if (empty($tag->$oneAttribute)) $tag->$oneAttribute = 0;
$tag->$oneAttribute = intval($tag->$oneAttribute);
}
if (empty($tag->amount)) return '';
$clean_name = strtoupper($user->name);
$space = strpos($clean_name, ' ');
if (!empty($space)) $clean_name = substr($clean_name, 0, $space);
$couponCode = str_replace(
[
'[name]',
'[userid]',
'[email]',
'[key]',
'[value]',
],
[
$clean_name,
$user->id,
$user->email,
acym_generateKey(5),
$tag->amount,
],
$tag->code
);
$coupon = [
'post_title' => $couponCode,
'post_content' => '',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'shop_coupon',
];
$couponId = wp_insert_post($coupon);
update_post_meta($couponId, 'discount_type', $tag->type);
update_post_meta($couponId, 'coupon_amount', $tag->amount);
update_post_meta($couponId, 'expiry_date', empty($tag->end) ? '' : $tag->end);
update_post_meta($couponId, 'date_expires', empty($tag->end) ? null : strtotime($tag->end));
update_post_meta($couponId, 'usage_limit', $tag->use);
update_post_meta($couponId, 'usage_limit_per_user', 0);
update_post_meta($couponId, 'limit_usage_to_x_items', $tag->items);
update_post_meta($couponId, 'usage_count', 0);
update_post_meta($couponId, 'minimum_amount', empty($tag->min) ? '' : $tag->min);
update_post_meta($couponId, 'maximum_amount', empty($tag->max) ? '' : $tag->max);
update_post_meta($couponId, 'free_shipping', empty($tag->free) ? 'no' : 'yes');
update_post_meta($couponId, 'exclude_sale_items', empty($tag->exclsale) ? 'no' : 'yes');
update_post_meta($couponId, 'product_ids', implode(',', $this->cleanElements($tag->prod)));
update_post_meta($couponId, 'exclude_product_ids', implode(',', $this->cleanElements($tag->exclprod)));
update_post_meta($couponId, 'product_categories', $this->cleanElements($tag->cat));
update_post_meta($couponId, 'exclude_product_categories', $this->cleanElements($tag->exclcat));
update_post_meta($couponId, 'individual_use', 'yes');
update_post_meta($couponId, 'customer_email', [$user->email]);
return $couponCode;
}
private function cleanElements($elements)
{
$elements = empty($elements) ? [] : explode(',', $elements);
acym_arrayToInteger($elements);
foreach ($elements as $i => $oneElement) {
if (empty($oneElement)) unset($elements[$i]);
}
return $elements;
}
public function searchProduct()
{
$return = [];
$search = acym_getVar('cmd', 'search', '');
$search_results = new WP_Query(
[
's' => $search,
'post_status' => 'publish',
'ignore_sticky_posts' => 1,
'post_type' => 'product',
'posts_per_page' => 20,
]
);
if ($search_results->have_posts()) {
while ($search_results->have_posts()) {
$search_results->the_post();
$return[] = [$search_results->post->ID, $search_results->post->post_title];
}
}
echo json_encode($return);
exit;
}
public function onAcymDeclareConditions(&$conditions)
{
$categories = [
'any' => acym_translation('ACYM_ANY_CATEGORY'),
];
$cats = acym_loadObjectList('SELECT term.term_id, term.`name` FROM #__terms AS term JOIN #__term_taxonomy AS tax ON term.term_id = tax.term_id WHERE tax.taxonomy = "product_cat" ORDER BY term.`name`');
foreach ($cats as $oneCat) {
$categories[$oneCat->term_id] = $oneCat->name;
}
$conditions['user']['woopurchased'] = new stdClass();
$conditions['user']['woopurchased']->name = acym_translation_sprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', acym_translation('ACYM_PURCHASED'));
$conditions['user']['woopurchased']->option = '';
$conditions['user']['woopurchased']->option .= '
'.acym_translation('ACYM_BOUGHT').'
';
$conditions['user']['woopurchased']->option .= '
';
$ajaxParams = json_encode(
[
'plugin' => 'plgAcymWoocommerce',
'trigger' => 'searchProduct',
]
);
$conditions['user']['woopurchased']->option .= acym_select(
[],
'acym_condition[conditions][__numor__][__numand__][woopurchased][product]',
null,
'class="acym__select acym_select2_ajax" data-placeholder="'.acym_translation('ACYM_AT_LEAST_ONE_PRODUCT', true).'" data-params="'.acym_escape($ajaxParams).'"'
);
$conditions['user']['woopurchased']->option .= '
';
$conditions['user']['woopurchased']->option .= '
';
$conditions['user']['woopurchased']->option .= acym_select($categories, 'acym_condition[conditions][__numor__][__numand__][woopurchased][category]', 'any', 'class="acym__select"');
$conditions['user']['woopurchased']->option .= '
';
$conditions['user']['woopurchased']->option .= '
';
$conditions['user']['woopurchased']->option .= '';
$conditions['user']['woopurchased']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woopurchased][datemin]', '', 'cell shrink');
$conditions['user']['woopurchased']->option .= '< ';
$conditions['user']['woopurchased']->option .= ''.acym_translation('ACYM_DATE_CREATED').' ';
$conditions['user']['woopurchased']->option .= '< ';
$conditions['user']['woopurchased']->option .= acym_dateField('acym_condition[conditions][__numor__][__numand__][woopurchased][datemax]', '', 'cell shrink');
$conditions['user']['woopurchased']->option .= '
';
$paymentMethods = ['any' => acym_translation('ACYM_ANY_PAYMENT_METHOD')];
if (function_exists('WC')) {
$payments = WC()->payment_gateways()->payment_gateways;
foreach ($payments as $oneMethod) {
$paymentMethods[$oneMethod->id] = $oneMethod->title;
}
}
$conditions['user']['wooreminder'] = new stdClass();
$conditions['user']['wooreminder']->name = acym_translation_sprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', acym_translation('ACYM_REMINDER'));
$conditions['user']['wooreminder']->option = '';
$conditions['user']['wooreminder']->option .= acym_translation_sprintf(
'ACYM_ORDER_WITH_STATUS',
'
',
'
'.acym_select(
[
'wc-pending' => _x('Pending payment', 'Order status', 'woocommerce'),
'wc-processing' => _x('Processing', 'Order status', 'woocommerce'),
'wc-on-hold' => _x('On hold', 'Order status', 'woocommerce'),
'wc-completed' => _x('Completed', 'Order status', 'woocommerce'),
'wc-cancelled' => _x('Cancelled', 'Order status', 'woocommerce'),
'wc-refunded' => _x('Refunded', 'Order status', 'woocommerce'),
'wc-failed' => _x('Failed', 'Order status', 'woocommerce'),
],
'acym_condition[conditions][__numor__][__numand__][wooreminder][status]',
'wc-pending',
'class="acym__select"'
).'
'
);
$conditions['user']['wooreminder']->option .= '
';
$conditions['user']['wooreminder']->option .= acym_select(
$paymentMethods,
'acym_condition[conditions][__numor__][__numand__][wooreminder][payment]',
'any',
'class="acym__select"'
);
$conditions['user']['wooreminder']->option .= '
';
$conditions['user']['wooreminder']->option .= '
';
}
public function onAcymDeclareFilters(&$filters)
{
$categories = [
'any' => acym_translation('ACYM_ANY_CATEGORY'),
];
$cats = acym_loadObjectList('SELECT term.term_id, term.`name` FROM #__terms AS term JOIN #__term_taxonomy AS tax ON term.term_id = tax.term_id WHERE tax.taxonomy = "product_cat" ORDER BY term.`name`');
foreach ($cats as $oneCat) {
$categories[$oneCat->term_id] = $oneCat->name;
}
$filters['woopurchased'] = new stdClass();
$filters['woopurchased']->name = acym_translation_sprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', acym_translation('ACYM_PURCHASED'));
$filters['woopurchased']->option = '';
$filters['woopurchased']->option .= '
'.acym_translation('ACYM_BOUGHT').'
';
$filters['woopurchased']->option .= '
';
$ajaxParams = json_encode(
[
'plugin' => 'plgAcymWoocommerce',
'trigger' => 'searchProduct',
]
);
$filters['woopurchased']->option .= acym_select(
[],
'acym_action[filters][__numor__][__numand__][woopurchased][product]',
null,
'class="acym__select acym_select2_ajax" data-placeholder="'.acym_translation('ACYM_AT_LEAST_ONE_PRODUCT', true).'" data-params="'.acym_escape($ajaxParams).'"'
);
$filters['woopurchased']->option .= '
';
$filters['woopurchased']->option .= '
';
$filters['woopurchased']->option .= acym_select($categories, 'acym_action[filters][__numor__][__numand__][woopurchased][category]', 'any', 'class="acym__select"');
$filters['woopurchased']->option .= '
';
$filters['woopurchased']->option .= '
';
$filters['woopurchased']->option .= '';
$filters['woopurchased']->option .= acym_dateField('acym_action[filters][__numor__][__numand__][woopurchased][datemin]', '', 'cell shrink');
$filters['woopurchased']->option .= '< ';
$filters['woopurchased']->option .= ''.acym_translation('ACYM_DATE_CREATED').' ';
$filters['woopurchased']->option .= '< ';
$filters['woopurchased']->option .= acym_dateField('acym_action[filters][__numor__][__numand__][woopurchased][datemax]', '', 'cell shrink');
$filters['woopurchased']->option .= '
';
$paymentMethods = ['any' => acym_translation('ACYM_ANY_PAYMENT_METHOD')];
if (function_exists('WC')) {
$payments = WC()->payment_gateways()->payment_gateways;
foreach ($payments as $oneMethod) {
$paymentMethods[$oneMethod->id] = $oneMethod->title;
}
}
$filters['wooreminder'] = new stdClass();
$filters['wooreminder']->name = acym_translation_sprintf('ACYM_COMBINED_TRANSLATIONS', 'WooCommerce', acym_translation('ACYM_REMINDER'));
$filters['wooreminder']->option = '';
$filters['wooreminder']->option .= acym_translation_sprintf(
'ACYM_ORDER_WITH_STATUS',
'
',
'
'.acym_select(
[
'wc-pending' => _x('Pending payment', 'Order status', 'woocommerce'),
'wc-processing' => _x('Processing', 'Order status', 'woocommerce'),
'wc-on-hold' => _x('On hold', 'Order status', 'woocommerce'),
'wc-completed' => _x('Completed', 'Order status', 'woocommerce'),
'wc-cancelled' => _x('Cancelled', 'Order status', 'woocommerce'),
'wc-refunded' => _x('Refunded', 'Order status', 'woocommerce'),
'wc-failed' => _x('Failed', 'Order status', 'woocommerce'),
],
'acym_action[filters][__numor__][__numand__][wooreminder][status]',
'wc-pending',
'class="acym__select"'
).'
'
);
$filters['wooreminder']->option .= '
';
$filters['wooreminder']->option .= acym_select(
$paymentMethods,
'acym_action[filters][__numor__][__numand__][wooreminder][payment]',
'any',
'class="acym__select"'
);
$filters['wooreminder']->option .= '
';
$filters['wooreminder']->option .= '
';
}
public function onAcymProcessFilterCount_woopurchased(&$query, $options, $num)
{
$this->onAcymProcessFilter_woopurchased($query, $options, $num);
return acym_translation_sprintf('ACYM_SELECTED_USERS', $query->count());
}
private function processConditionFilter_woopurchased(&$query, $options, $num)
{
$conditions = [];
$conditions[] = 'post'.$num.'.post_author != 0';
$conditions[] = 'post'.$num.'.post_type = "shop_order"';
$conditions[] = 'post'.$num.'.post_status = "wc-completed"';
if (!empty($options['datemin'])) {
$options['datemin'] = acym_replaceDate($options['datemin']);
if (!is_numeric($options['datemin'])) $options['datemin'] = strtotime($options['datemin']);
if (!empty($options['datemin'])) {
$conditions[] = 'post'.$num.'.post_date > '.acym_escapeDB(acym_date($options['datemin'], "Y-m-d H:i:s"));
}
}
if (!empty($options['datemax'])) {
$options['datemax'] = acym_replaceDate($options['datemax']);
if (!is_numeric($options['datemax'])) $options['datemax'] = strtotime($options['datemax']);
if (!empty($options['datemax'])) {
$conditions[] = 'post'.$num.'.post_date < '.acym_escapeDB(acym_date($options['datemax'], "Y-m-d H:i:s"));
}
}
$query->join['woopurchased_post'.$num] = '#__posts AS post'.$num.' ON post'.$num.'.post_author = user.cms_id AND '.implode(' AND ', $conditions);
if (!empty($options['product'])) {
$query->join['woopurchased_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON post'.$num.'.ID = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"';
$query->join['woopurchased_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key = "_product_id" AND woooim'.$num.'.meta_value = '.intval($options['product']);
} elseif (!empty($options['category']) && $options['category'] != 'any') {
$query->join['woopurchased_order_items'.$num] = '#__woocommerce_order_items AS woooi'.$num.' ON post'.$num.'.ID = woooi'.$num.'.order_id AND woooi'.$num.'.order_item_type = "line_item"';
$query->join['woopurchased_order_itemmeta'.$num] = '#__woocommerce_order_itemmeta AS woooim'.$num.' ON woooi'.$num.'.order_item_id = woooim'.$num.'.order_item_id AND woooim'.$num.'.meta_key = "_product_id"';
$query->join['woopurchased_cat_map'.$num] = '#__term_relationships AS termrel'.$num.' ON termrel'.$num.'.object_id = woooim'.$num.'.meta_value';
$query->join['woopurchased_cat'.$num] = '#__term_taxonomy AS termtax'.$num.' ON termtax'.$num.'.term_taxonomy_id = termrel'.$num.'.term_taxonomy_id AND termtax'.$num.'.term_id = '.intval($options['category']);
}
}
public function onAcymProcessCondition_woopurchased(&$query, $options, $num, &$conditionNotValid)
{
$this->processConditionFilter_woopurchased($query, $options, $num);
$affectedRows = $query->count();
if (empty($affectedRows)) $conditionNotValid++;
}
public function onAcymProcessFilter_woopurchased(&$query, $options, $num)
{
$this->processConditionFilter_woopurchased($query, $options, $num);
}
public function onAcymProcessFilterCount_wooreminder(&$query, $options, $num)
{
$this->onAcymProcessFilter_wooreminder($query, $options, $num);
return acym_translation_sprintf('ACYM_SELECTED_USERS', $query->count());
}
private function processConditionFilter_wooreminder(&$query, $options, $num)
{
$options['days'] = intval($options['days']);
$query->join['wooreminder_post'.$num] = '#__posts AS post'.$num.' ON post'.$num.'.post_author = user.cms_id';
$query->where[] = 'user.cms_id != 0';
$query->where[] = 'post'.$num.'.post_type = "shop_order"';
$query->where[] = 'SUBSTRING(post'.$num.'.post_date, 1, 10) = '.acym_escapeDB(date('Y-m-d', time() - ($options['days'] * 86400)));
$query->where[] = 'post'.$num.'.post_status = '.acym_escapeDB($options['status']);
if (!empty($options['payment']) && $options['payment'] != 'any') {
$query->join['wooreminder_postmeta'.$num] = '#__postmeta AS postmeta'.$num.' ON postmeta'.$num.'.post_id = post'.$num.'.ID';
$query->where[] = 'postmeta'.$num.'.meta_key = "_payment_method"';
$query->where[] = 'postmeta'.$num.'.meta_value = '.acym_escapeDB($options['payment']);
}
}
public function onAcymProcessCondition_wooreminder(&$query, $options, $num, &$conditionNotValid)
{
$this->processConditionFilter_wooreminder($query, $options, $num);
$affectedRows = $query->count();
if (empty($affectedRows)) $conditionNotValid++;
}
public function onAcymProcessFilter_wooreminder(&$query, $options, $num)
{
$this->processConditionFilter_wooreminder($query, $options, $num);
}
function onAcymDeclareSummary_conditions(&$automationCondition)
{
$this->summaryConditionFilters($automationCondition);
}
private function summaryConditionFilters(&$automationCondition)
{
if (!empty($automationCondition['wooreminder'])) {
$paymentMethods = ['any' => acym_translation('ACYM_ANY_PAYMENT_METHOD')];
if (function_exists('WC')) {
$payments = WC()->payment_gateways()->payment_gateways;
foreach ($payments as $oneMethod) {
$paymentMethods[$oneMethod->id] = $oneMethod->title;
}
}
$orderStatus = [
'wc-pending' => _x('Pending payment', 'Order status', 'woocommerce'),
'wc-processing' => _x('Processing', 'Order status', 'woocommerce'),
'wc-on-hold' => _x('On hold', 'Order status', 'woocommerce'),
'wc-completed' => _x('Completed', 'Order status', 'woocommerce'),
'wc-cancelled' => _x('Cancelled', 'Order status', 'woocommerce'),
'wc-refunded' => _x('Refunded', 'Order status', 'woocommerce'),
'wc-failed' => _x('Failed', 'Order status', 'woocommerce'),
];
$automationCondition = acym_translation_sprintf(
'ACYM_CONDITION_ECOMMERCE_REMINDER',
intval($automationCondition['wooreminder']['days']),
$orderStatus[$automationCondition['wooreminder']['status']],
$paymentMethods[$automationCondition['wooreminder']['payment']]
);
}
if (!empty($automationCondition['woopurchased'])) {
if (empty($automationCondition['woopurchased']['product'])) {
$product = acym_translation('ACYM_AT_LEAST_ONE_PRODUCT');
} else {
$product = get_post($automationCondition['woopurchased']['product']);
$product = $product->post_title;
}
$cats = acym_loadObjectList('SELECT term.`term_id`, term.`name` FROM #__terms AS term JOIN #__term_taxonomy AS tax ON term.term_id = tax.term_id WHERE tax.taxonomy = "product_cat"', 'term_id');
$category = empty($cats[$automationCondition['woopurchased']['category']]) ? acym_translation('ACYM_ANY_CATEGORY') : $cats[$automationCondition['woopurchased']['category']]->name;
$finalText = acym_translation_sprintf('ACYM_CONDITION_PURCHASED', $product, $category);
$dates = [];
if (!empty($automationCondition['woopurchased']['datemin'])) {
$dates[] = acym_translation('ACYM_AFTER').' '.acym_replaceDate($automationCondition['woopurchased']['datemin'], true);
}
if (!empty($automationCondition['woopurchased']['datemax'])) {
$dates[] = acym_translation('ACYM_BEFORE').' '.acym_replaceDate($automationCondition['woopurchased']['datemax'], true);
}
if (!empty($dates)) {
$finalText .= ' '.implode(' '.acym_translation('ACYM_AND').' ', $dates);
}
$automationCondition = $finalText;
}
}
function onAcymDeclareSummary_filters(&$automationFilter)
{
$this->summaryConditionFilters($automationFilter);
}
}