File "store.php"
Full Path: /home/aiclgcwq/photonindustriespvt.com/wp-content/plugins/agile-store-locator/includes/admin/store.php
File size: 32.52 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace AgileStoreLocator\Admin;
use AgileStoreLocator\Admin\Base;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* The store manager functionality of the plugin.
*
* @link https://agilestorelocator.com
* @since 4.7.32
*
* @package AgileStoreLocator
* @subpackage AgileStoreLocator/Admin/Store
*/
class Store extends Base {
/**
* [__construct description]
*/
public function __construct() {
parent::__construct();
}
/**
* [admin_delete_all_stores Delete All Stores, Logos and Category Relations]
* @return [type] [description]
*/
public function admin_delete_all_stores() {
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
global $wpdb;
$prefix = ASL_PREFIX;
$wpdb->query("TRUNCATE TABLE `{$prefix}stores_categories`");
$wpdb->query("TRUNCATE TABLE `{$prefix}stores`");
$wpdb->query("TRUNCATE TABLE `{$prefix}stores_meta`");
apply_filters('asl_store_delete_all', []);
$response = new \stdclass();
$response->success = false;
$response->success = true;
$response->msg = esc_attr__('All Stores are deleted','asl_locator');
return $this->send_response($response);
}
/**
* [get_store_list GET List of Stores]
* @return [type] [description]
*/
public function get_store_list() {
global $wpdb;
$asl_prefix = ASL_PREFIX;
$start = isset( $_REQUEST['iDisplayStart'])?$_REQUEST['iDisplayStart']:0;
$params = isset($_REQUEST)?$_REQUEST:null;
$categories = isset($_REQUEST['categories'])?intval($_REQUEST['categories']):null;
$acolumns = array(
ASL_PREFIX.'stores.id', ASL_PREFIX.'stores.id ',ASL_PREFIX.'stores.id ',ASL_PREFIX.'stores.id ','title','description',
'lat','lng','street','state','city',
'phone','email','website','postal_code','is_disabled',
ASL_PREFIX.'stores.id','marker_id', 'logo_id', 'pending',
ASL_PREFIX.'stores.created_on'/*,'country_id'*/
);
$columnsFull = array(
ASL_PREFIX.'stores.id as id',ASL_PREFIX.'stores.id as id',ASL_PREFIX.'stores.id as id',ASL_PREFIX.'stores.id as id','title','description','lat','lng','street','state', ASL_PREFIX.'countries.country','city','phone','email','website','postal_code',ASL_PREFIX.'stores.is_disabled',ASL_PREFIX.'stores.created_on', 'pending'
);
// All the prepare parameters
$prepare_params = [];
$clause = array();
if(isset($_REQUEST['filter'])) {
// Get all searchable columns
$searchable_columns = \AgileStoreLocator\Model\Store::get_searchable_columns();
// Loop over the filters
foreach($_REQUEST['filter'] as $key => $value) {
// When we have a value
if($value != '') {
$value = $this->clean_input($value);
$key = $this->clean_input($key);
// $key must be within the allowed attributes
$key = in_array($key, $searchable_columns)? $key: 'id';
// Disabled
if($key == 'is_disabled')
{
$value = ($value == 'yes')? 1: 0;
$clause[] = ASL_PREFIX."stores.{$key} = 1";
continue;
}
// Marker ID
elseif($key == 'marker_id' || $key == 'logo_id')
{
$clause[] = ASL_PREFIX."stores.{$key} = %s";
$prepare_params[] = $value;
continue;
}
// Country Clause
elseif($key == 'country')
{
$clause[] = ASL_PREFIX."countries.{$key} LIKE %s";
$prepare_params[] = "%$value%";
continue;
}
// Other columns
$prepare_params[] = "%$value%";
$clause[] = ASL_PREFIX."stores.{$key} LIKE %s";
}
}
}
//iDisplayStart::Limit per page
$sLimit = "";
$displayStart = isset($_REQUEST['iDisplayStart'])?intval($_REQUEST['iDisplayStart']):0;
if ( isset( $_REQUEST['iDisplayStart'] ) && $_REQUEST['iDisplayLength'] != '-1' )
{
$sLimit = "LIMIT ".$displayStart.", ".
intval( $_REQUEST['iDisplayLength'] );
}
else
$sLimit = "LIMIT ".$displayStart.", 20 ";
/*
* Ordering
*/
$sOrder = "";
if ( isset( $_REQUEST['iSortCol_0'] ) )
{
$sOrder = "ORDER BY ";
for ( $i=0 ; $i < intval( $_REQUEST['iSortingCols'] ) ; $i++ )
{
if (isset($_REQUEST['iSortCol_'.$i]))
{
$sort_dir = (isset($_REQUEST['sSortDir_0']) && $_REQUEST['sSortDir_0'] == 'asc')? 'ASC': 'DESC';
$sOrder .= $acolumns[ intval( $_REQUEST['iSortCol_'.$i] ) ]." ".$sort_dir;
break;
}
}
if ( $sOrder == "ORDER BY" )
{
$sOrder = "";
}
}
// When Pending isn't required, filter the pending stores
if(!(isset($_REQUEST['filter']) && isset($_REQUEST['filter']['pending']))) {
$clause[] = '('.ASL_PREFIX."stores.pending IS NULL OR ".ASL_PREFIX."stores.pending = 0)";
}
// When Categories filter is applied
if($categories) {
$clause[] = ASL_PREFIX.'stores_categories.category_id = '.$categories;
}
// Add the lang Filter
$clause[] = ASL_PREFIX."stores.lang = '{$this->lang}'";
$sWhere = implode(' AND ', $clause);
if($sWhere != '')$sWhere = ' WHERE '.$sWhere;
$fields = implode(',', $columnsFull);
$fields .= ',marker_id,logo_id,group_concat(category_id) as categories,'.ASL_PREFIX.'countries.country';
// Get the fields
$sql = "SELECT $fields FROM ".ASL_PREFIX."stores LEFT JOIN ".ASL_PREFIX."stores_categories ON ".ASL_PREFIX."stores.id = ".ASL_PREFIX."stores_categories.store_id LEFT JOIN ".ASL_PREFIX."countries ON ".ASL_PREFIX."stores.country = ".ASL_PREFIX."countries.id ";
// Count Stores
$sqlCount = "SELECT COUNT(DISTINCT(".ASL_PREFIX."stores.id)) 'count' FROM ".ASL_PREFIX."stores LEFT JOIN ".ASL_PREFIX."stores_categories ON ".ASL_PREFIX."stores.id = ".ASL_PREFIX."stores_categories.store_id LEFT JOIN ".ASL_PREFIX."countries ON ".ASL_PREFIX."stores.country = ".ASL_PREFIX."countries.id";
/*
* SQL queries
* Get data to display
*/
$sQuery = "{$sql} {$sWhere} GROUP BY ".ASL_PREFIX."stores.id {$sOrder} {$sLimit}";
// When we have prepare parameters run the prepare
if(count($prepare_params) > 0) {
$sQuery = $wpdb->prepare($sQuery, $prepare_params);
}
// backup of query for debug
$dQuery = $sQuery;
$data_output = $wpdb->get_results($sQuery);
//$wpdb->show_errors = true;
//$error = $wpdb->last_error;
/* Data set length after filtering */
$sQuery = "{$sqlCount} {$sWhere}";
// When we have prepare parameters run the prepare
if(count($prepare_params) > 0) {
$sQuery = $wpdb->prepare($sQuery, $prepare_params);
}
$r = $wpdb->get_results($sQuery);
$iFilteredTotal = $r[0]->count;
$iTotal = $iFilteredTotal;
/*
* Output
*/
$sEcho = isset($_REQUEST['sEcho'])?intval($_REQUEST['sEcho']):1;
$output = array(
"sEcho" => intval($_REQUEST['sEcho']),
"iTotalRecords" => $iTotal,
// "query" => $dQuery,
//'orderby' => $sOrder,
"iTotalDisplayRecords" => $iFilteredTotal,
"aaData" => array()
);
// Loop over the stores
foreach($data_output as $aRow) {
// Sanitize the store object
$row = \AgileStoreLocator\Helper::sanitize_store($aRow);
$edit_url = 'admin.php?page=edit-agile-store&store_id='.$row->id;
// Action Row
$row->action = '<div class="edit-options">
<a class="row-cpy" title="Duplicate" data-id="'.$row->id.'"><svg width="14" height="14"><use xlink:href="#i-clipboard"></use></svg></a>
<a href="'.$edit_url.'"><svg width="14" height="14"><use xlink:href="#i-edit"></use></svg></a>
<a title="Delete" data-id="'.$row->id.'" class="glyphicon-trash"><svg width="14" height="14"><use xlink:href="#i-trash"></use></svg></a>
</div>';
// Show a approve button
if(isset($row->pending) && $row->pending == '1') {
$row->action .= '<button data-id="'.$row->id.'" data-loading-text="'.esc_attr__('Approving...','asl_locator').'" class="btn btn-approve btn-success" type="button">'.esc_attr__('Approve','asl_locator').'</button>';
}
$row->check = '<div class="custom-control custom-checkbox"><input type="checkbox" data-id="'.$row->id.'" class="custom-control-input" id="asl-chk-'.$row->id.'"><label class="custom-control-label" for="asl-chk-'.$row->id.'"></label></div>';
// When the store is diabled
$row->is_disabled = (isset($row->is_disabled) && $row->is_disabled == '1')? '<span class="red">'.esc_attr__('Yes','asl_locator').'</span>' : esc_attr__('No','asl_locator');
//Show country with state
/*if($row->state && isset($row->iso_code_2))
$row->state = $row->state.', '.$row->iso_code_2;*/
$output['aaData'][] = $row;
// Get the categories
if($aRow->categories) {
$categories_ids = explode(',', $aRow->categories);
$categories_ids = array_filter($categories_ids);
if (count($categories_ids)) {
$categories_ids = implode(',', $categories_ids);
$categories_ = $wpdb->get_results("SELECT category_name FROM ".ASL_PREFIX."categories WHERE id IN ($categories_ids)");
$cnames = array();
foreach($categories_ as $cat_)
$cnames[] = esc_attr($cat_->category_name);
$aRow->categories = implode(', ', $cnames);
}
}
}
return $this->send_response($output);
}
/**
* [validate_coordinates Validate that all the coordinates are Valid]
* @return [type] [description]
*/
public function validate_coordinates() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
// initial message
$message = esc_attr__('Success! All coordinates looks correct values', 'asl_locator');
// get the stores
$invalid_stores = $wpdb->get_results("SELECT id FROM ".ASL_PREFIX."stores WHERE (lat = '' AND lng = '') OR (lat IS NULL AND lng IS NULL) OR !(lat BETWEEN -90.10 AND 90.10) OR !(lng BETWEEN -180.10 AND 180.10) OR !(lat REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$') OR !(lng REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$')");
// Validate the Count difference
if($invalid_stores) {
$coord_with_err = count($invalid_stores);
// When less than 10, show the numbers
if($coord_with_err < 10) {
// get the store IDs
$store_ids = array_map(function($value) { return $value->id;}, $invalid_stores);
$store_ids = implode(',', $store_ids);
$coord_with_err .= ' ('.$store_ids.')';
}
// prepare the message
if($coord_with_err)
$message = esc_attr__("Error! Wrong coordinates of {$coord_with_err} stores", 'asl_locator');
}
// Check the Default Coordinates
$sql = "SELECT `key`,`value` FROM ".ASL_PREFIX."configs WHERE `key` = 'default_lat' || `key` = 'default_lng'";
$all_configs_result = $wpdb->get_results($sql);
$all_configs = array();
foreach($all_configs_result as $c) {
$all_configs[$c->key] = $c->value;
}
$is_valid = \AgileStoreLocator\Helper::validate_coordinate($all_configs['default_lat'], $all_configs['default_lng']);
// Default Lat/Lng are invalid
if(!$is_valid) {
$message .= '<br>'.esc_attr__('Default Lat & Default Lng values are invalid!', 'asl_locator');
}
// All Passed
if(!$invalid_stores && $is_valid) {
$response->success = true;
}
$response->msg = $message;
return $this->send_response($response);
}
/**
* [remove_duplicates Remove all the duplicate rows]
* @return [type] [description]
*/
public function remove_duplicates() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
$asl_prefix = ASL_PREFIX;
$remove_query = "DELETE s1 FROM {$asl_prefix}stores s1
INNER JOIN {$asl_prefix}stores s2
WHERE s1.id < s2.id AND s1.title = s2.title AND s1.lat = s2.lat AND s1.lng = s2.lng AND s1.lang = s2.lang;";
// All Count
$all_count = $wpdb->get_results("SELECT COUNT(*) AS c FROM ".ASL_PREFIX."stores");
// Previous count
$all_count = $all_count[0];
// Remove the duplicates
if($wpdb->query($remove_query)) {
// All Count
$new_count = $wpdb->get_results("SELECT COUNT(*) AS c FROM ".ASL_PREFIX."stores");
// Previous count
$new_count = $new_count[0];
$removed = $all_count->c - $new_count->c;
$response->msg = $removed.' '.esc_attr__('Duplicate stores removed','asl_locator');
$response->success = true;
}
else {
$response->error = esc_attr__('No Duplicate deleted!','asl_locator');//$form_data
$response->msg = $wpdb->show_errors();
}
return $this->send_response($response);
}
/**
* [duplicate_store to Duplicate the store]
* @return [type] [description]
*/
public function duplicate_store() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
$store_id = isset($_REQUEST['store_id'])? intval($_REQUEST['store_id']): 0;
$result = $wpdb->get_results("SELECT * FROM ".ASL_PREFIX."stores WHERE id = ".$store_id);
if($result && $result[0]) {
$result = (array)$result[0];
unset($result['id']);
unset($result['created_on']);
unset($result['updated_on']);
// Get Custom fields for the store to duplicate
$custom_fields = ($result['custom'])? json_decode($result['custom'], true): null;
// Create a new slug
$result['slug'] = \AgileStoreLocator\Schema\Slug::slugify($result, $custom_fields);
//insert into stores table
if($wpdb->insert( ASL_PREFIX.'stores', $result)){
$response->success = true;
$new_store_id = $wpdb->insert_id;
//get categories and copy them
$s_categories = $wpdb->get_results("SELECT * FROM ".ASL_PREFIX."stores_categories WHERE store_id = ".$store_id);
/*Save Categories*/
foreach ($s_categories as $_category) {
$wpdb->insert(ASL_PREFIX.'stores_categories',
array('store_id'=>$new_store_id,'category_id'=>$_category->category_id),
array('%s','%s'));
}
//SEnd the response
$response->msg = esc_attr__('Store duplicated successfully.','asl_locator');
}
else
{
$response->error = esc_attr__('Error occurred while saving Store','asl_locator');//$form_data
$response->msg = $wpdb->show_errors();
}
}
return $this->send_response($response);
}
/**
* [add_new_store POST METHODS for Add New Store]
*/
public function add_new_store() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
$form_data = stripslashes_deep($_REQUEST['data']);
// lang
$form_data['lang'] = $this->lang;
// These two fields are allowed limited HTML tags
$description_field = $this->clean_input_html($form_data['description']);
$description_field_2 = $this->clean_input_html($form_data['description_2']);
// Custom Field
$custom_fields = (isset($_REQUEST['asl-custom']) && $_REQUEST['asl-custom'])? stripslashes_deep($_REQUEST['asl-custom']): null;
$custom_fields = ($custom_fields && is_array($custom_fields) && count($custom_fields) > 0)? $this->clean_html_array($custom_fields): null;
// Clean the array
$form_data = $this->clean_input_array($form_data);
// Add them again after the input cleaning
$form_data['description'] = $description_field;
$form_data['description_2'] = $description_field_2;
// Add the Custom Fields, already cleaned
$form_data['custom'] = ($custom_fields)? json_encode($custom_fields): null;
// Prevent duplication of slug (update function)
$form_data['slug'] = \AgileStoreLocator\Schema\Slug::slugify($form_data, $custom_fields);
// Insert into stores table
if($wpdb->insert( ASL_PREFIX.'stores', $form_data)) {
$response->success = true;
$store_id = $wpdb->insert_id;
$categories = (isset($_REQUEST['sl-category']) && $_REQUEST['sl-category'])? ($_REQUEST['sl-category']): null;
// Save Categories
if($categories)
foreach ($categories as $category) {
$wpdb->insert(ASL_PREFIX.'stores_categories',
array(
'store_id' => $store_id,
'category_id' => $category
),
array('%s','%s')
);
}
// Add a filter for asl-wc to modify the data
if(isset($_REQUEST['sl_wc'])){
apply_filters( 'asl_woocommerce_store_settings', $_REQUEST['sl_wc'], $store_id);
}
// Add a filter for asl-grr to modify the data
if(isset($_REQUEST['grr'])){
apply_filters( 'asl_google_grr_store_data', $_REQUEST['grr'], $store_id);
}
$response->store_id = $store_id;
$response->msg = esc_attr__('Store added successfully.','asl_locator');
}
else {
$wpdb->show_errors = true;
$response->error = esc_attr__('Error occurred while saving Store','asl_locator');
$response->msg = $wpdb->print_error();
}
return $this->send_response($response);
}
/**
* [update_store update Store]
* @return [type] [description]
*/
public function update_store() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
$form_data = stripslashes_deep($_REQUEST['data']);
$update_id = isset($_REQUEST['updateid'])? intval($_REQUEST['updateid']) : 0;
// Custom Field
$custom_fields = (isset($_REQUEST['asl-custom']) && $_REQUEST['asl-custom'])? stripslashes_deep($_REQUEST['asl-custom']): null;
$custom_fields = ($custom_fields && is_array($custom_fields) && count($custom_fields) > 0)? $this->clean_html_array($custom_fields): null;
// When Update Id is there
if($update_id && is_numeric($update_id)) {
// These two fields are allowed limited HTML tags
$description_field = $this->clean_input_html($form_data['description']);
$description_field_2 = $this->clean_input_html($form_data['description_2']);
$store_data = array(
'title' => $form_data['title'],
'phone' => $form_data['phone'],
'fax' => $form_data['fax'],
'email' => $form_data['email'],
'street' => $form_data['street'],
'postal_code' => $form_data['postal_code'],
'city' => $form_data['city'],
'state' => $form_data['state'],
'lat' => $form_data['lat'],
'lng' => $form_data['lng'],
'website' => $this->fixURL($form_data['website']),
'country' => $form_data['country'],
'is_disabled' => (isset($form_data['is_disabled']) && $form_data['is_disabled'])?'1':'0',
'logo_id' => '',
'marker_id' => '',
'brand' => '',
'special' => '',
'logo_id' => $form_data['logo_id'],
'open_hours' => $form_data['open_hours'],
'ordr' => $form_data['ordr'],
'updated_on' => date('Y-m-d H:i:s')
);
// Clean the array
$store_data = $this->clean_input_array($store_data);
// Add them again after the input cleaning
$store_data['description'] = $description_field;
$store_data['description_2'] = $description_field_2;
// Add the Custom Fields, already cleaned
$store_data['custom'] = ($custom_fields)? json_encode($custom_fields): null;
// Update into stores table
$wpdb->update(ASL_PREFIX."stores", $store_data, array('id' => $update_id));
$sql = "DELETE FROM ".ASL_PREFIX."stores_categories WHERE store_id = ".$update_id;
$wpdb->query($sql);
$categories = (isset($_REQUEST['sl-category']) && $_REQUEST['sl-category'])? ($_REQUEST['sl-category']): null;
// Save Categories
if($categories) {
foreach ($categories as $category) {
$wpdb->insert(ASL_PREFIX.'stores_categories',
array(
'store_id' => $update_id,
'category_id' => $category
),
array('%s','%s'));
}
}
// Add a filter for the Multi-Store Addons for WooCommerce
if(isset($_REQUEST['sl_wc'])) {
apply_filters( 'asl_woocommerce_store_settings', $_REQUEST['sl_wc'], $update_id);
}
// Add a filter for the Agile Google Reviews Rating
if(isset($_REQUEST['grr'])){
// dd('yes');
apply_filters( 'asl_google_grr_store_data', $_REQUEST['grr'], $update_id);
}
$response->msg = esc_attr__('Store updated successfully.','asl_locator');
$response->success = true;
}
else {
$response->msg = esc_attr__('Error! update id not found.','asl_locator');
}
return $this->send_response($response);
}
/**
* [delete_store To delete the store/stores]
* @return [type] [description]
*/
public function delete_store() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
$multiple = isset($_REQUEST['multiple'])? $_REQUEST['multiple']: null;
$delete_sql;
// For Multiple rows
if($multiple) {
$store_id = implode(",", array_map( 'intval', $_POST['item_ids'] ));
$delete_sql = "DELETE FROM ".ASL_PREFIX."stores WHERE id IN (".$store_id.")";
}
else {
$store_id = intval($_REQUEST['store_id']);
$delete_sql = "DELETE FROM ".ASL_PREFIX."stores WHERE id = ".$store_id;
}
// Delete Store?
if($wpdb->query($delete_sql)) {
apply_filters( 'asl_store_delete', $multiple, $store_id);
$response->success = true;
$response->msg = ($multiple)?__('Stores deleted successfully.','asl_locator'):esc_attr__('Store deleted successfully.','asl_locator');
}
else {
$response->error = esc_attr__('Error occurred while saving record','asl_locator');//$form_data
$response->msg = $wpdb->show_errors();
}
return $this->send_response($response);
}
/**
* [store_status To Change the Status of Store]
* @return [type] [description]
*/
public function store_status() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
$status = (isset($_REQUEST['status']) && $_REQUEST['status'] == '1')?'0':'1';
$status_title = ($status == '1')? esc_attr__('Disabled','asl_locator'): esc_attr__('Enabled','asl_locator');
$delete_sql;
$item_ids = implode(",", array_map( 'intval', $_POST['item_ids'] ));
$update_sql = "UPDATE ".ASL_PREFIX."stores SET is_disabled = {$status} WHERE id IN (".$item_ids.")";
if($wpdb->query($update_sql)) {
$response->success = true;
$response->msg = esc_attr__('Selected Stores','asl_locator').' '.$status_title;
}
else {
$response->error = esc_attr__('Error occurred while Changing Status','asl_locator');
$response->msg = $wpdb->show_errors();
}
return $this->send_response($response);
}
/**
* [approve_stores Approve Stores]
* @return [type] [description]
*/
public function approve_stores() {
global $wpdb;
$response = new \stdclass();
$response->success = false;
// store to approve
$store_id = intval($_REQUEST['store_id']);
// Approve the store
if(Store::approve_store($store_id)) {
$response->pending_count = Store::pending_store_count();
// send
do_action('asl_send_approval_email', $store_id);
$response->success = true;
$response->msg = esc_attr__('Success! Store is approved and registered into the listing.','asl_locator');
}
else if (!$response->error) {
$response->error = esc_attr__('Error occurred while approving the records','asl_locator');//$form_data
}
return $this->send_response($response);
}
/**
* [approve_store Approve the store that is pending to be live]
* @param [type] $store_id [description]
* @return [type] [description]
*/
public static function approve_store($store_id) {
global $wpdb;
$store = $wpdb->get_results($wpdb->prepare("SELECT * FROM ".ASL_PREFIX."stores WHERE id = %d", $store_id));
// Store is found?
if(!$store || !isset($store[0])) {
return ['msg' => esc_attr__('Error! Store not found.','asl_locator'), 'success' => false];
}
// First index of the store
$store = $store[0];
// Has valid coordinates?
$is_valid = \AgileStoreLocator\Helper::validate_coordinate($store->lat, $store->lng);
$api_key = \AgileStoreLocator\Helper::get_configs('server_key');
// Already approved?
if($store->pending != '1') {
return ['msg' => $store->title.' '.esc_attr__('Store is already approved.','asl_locator'), 'success' => false];
}
// Validate the API
if(!$is_valid && !$api_key) {
return ['msg' => esc_attr__('Google Server API key is missing.','asl_locator'), 'success' => false];
}
// Get the right coordinates
$coordinates = ($is_valid)? ['lat' => $store->lat, 'lng' => $store->lng]: \AgileStoreLocator\Helper::getCoordinates($store->street, $store->city, $store->state, $store->postal_code, $store->country, $api_key);
// When we have coordinates
if($coordinates) {
if($wpdb->update( ASL_PREFIX.'stores', array('pending' => null, 'lat' => $coordinates['lat'], 'lng' => $coordinates['lng']), array('id'=> $store->id ))){
// Send a notification
self::send_approved_email($store);
return ['success' => true];
}
}
// Failed for the coordinates
return ['msg' => esc_attr__('Error! Failed to validate for the coordinates by the Google API, validate the Server API key.','asl_locator'), 'success' => false];
}
/**
* [pending_store_count Return the count of pending stores]
* @return [type] [description]
*/
public static function pending_store_count() {
global $wpdb;
// Get the Count of the Pendng Stores
$pending_stores = $wpdb->get_results("SELECT COUNT(*) AS c FROM ".ASL_PREFIX."stores WHERE pending = 1");
$pending_stores = ($pending_stores && isset($pending_stores[0]))? $pending_stores[0]->c: 0;
return $pending_stores;
}
/**
* [register_notification Send the notification to the owner about registeration of the new store]
* @param [type] $form_data [description]
* @param [type] $store_id [description]
* @return [type] [description]
*/
public static function register_notification($form_data, $store_id) {
global $wpdb;
$all_configs = \AgileStoreLocator\Helper::get_configs(['admin_notify', 'notify_email']);
// Validate the admin notification checkbox is enabled
if(isset($all_configs['admin_notify']) && $all_configs['admin_notify'] == '1') {
$admin_email = (isset($all_configs['notify_email']) && $all_configs['notify_email'])? $all_configs['notify_email']: null;
$user_email = $form_data['email'];
// Check if the admin email is there
if($admin_email) {
// When no-email is provided
if(!$user_email) {
$user_email = $admin_email;
}
// Prepare the store details
$locality = implode(', ', array($form_data['city'], $form_data['state'], $form_data['postal_code']));
$address = [$form_data['street'], $locality];
if(is_array($address)) {
$address = implode(', ', $address);
}
$address = strip_tags(trim($address));
$subject = esc_attr__("Store Locator Updates! New Store Registered",'asl_locator');
// Rest of the fields
$content_html = '';
foreach ($form_data as $key => $value) {
if(!in_array($key, array('title', 'description_2', 'country', 'is_disabled', 'logo_id', 'marker_id', 'custom', 'open_hours', 'ordr', 'pending', 'updated_on', 'lat', 'lng')) && $value) {
$content_html .= '<p>'.self::get_field_label(sanitize_text_field($key)).': '.sanitize_text_field($value).' </p>';
}
}
$message = '<p>'.esc_attr__('New store is registered with these details.','asl_locator'). '</p><br>'.
'<p>'.esc_attr__('Title: ','asl_locator').strip_tags($form_data['title']).'</p>'.
'<p>'.esc_attr__('Address: ','asl_locator').sanitize_text_field($address).'</p>'.$content_html.
__('<p><a href="%verification_url%" target="_blank">Approve Store</a> to adding it in listing.</p>', 'asl_locator');
// Generate the code
$activation_code = md5(uniqid());
// Save it as meta
\AgileStoreLocator\Helper::set_option($store_id, 'activation_code', $activation_code);
$message = str_replace( '%verification_url%', self::store_activation_link($store_id, $activation_code), $message );
// Send a email notification
\AgileStoreLocator\Helper::send_email($admin_email, $subject, $message);
}
}
}
/**
* [send_approved_email Send a notification when store is approved]
* @param [type] $store [description]
* @return [type] [description]
*/
public static function send_approved_email($store) {
// check the notification status
$all_configs = \AgileStoreLocator\Helper::get_configs(['admin_notify']);
if(isset($all_configs['admin_notify']) && $all_configs['admin_notify'] == '1' && $store->email) {
$subject = get_bloginfo().' :: '.esc_attr__("Store Approved Successfully",'asl_locator');
$message = '<p>'.esc_attr__('Congratulations! your registered store has been approved and is live now!.','asl_locator'). '</p><br>'.
'<p>'.esc_attr__('Title: ','asl_locator').sanitize_text_field($store->title).'</p>';
// Send a email notification
\AgileStoreLocator\Helper::send_email($store->email, $subject, $message);
}
}
/**
* [verify_store_link Verify the link for the store and approve it]
* @param [type] $store_id [description]
* @param [type] $validation_code [description]
* @return [type] [description]
*/
public static function verify_store_link($store_id, $validation_code) {
$activation_code = \AgileStoreLocator\Helper::get_option($store_id, 'activation_code');
// When the code match, remove it from pending state
if($activation_code && $activation_code == $validation_code) {
$results = self::approve_store($store_id);
if($results['success']) {
echo esc_attr__('Success! Store has been approved.','asl_locator');
}
else
echo $results['msg'];
die;
}
}
/**
* [store_activation_link Generate a link to activate the store]
* @param [type] $store_id [description]
* @param [type] $activation_code [description]
* @return [type] [description]
*/
public static function store_activation_link($store_id, $activation_code){
return admin_url( 'admin-ajax.php' ).'?action=asl_approve_store&sl-store='.$store_id.'&sl-verify='.$activation_code;
}
/**
* [get_field_label Return the field label]
* @param [type] $name [description]
* @return [type] [description]
*/
private static function get_field_label($name) {
$label_text = $name;
switch ($name) {
case 'title':
$label_text = esc_attr__('Title','asl_locator');
break;
case 'description':
$label_text = esc_attr__('Description','asl_locator');
break;
case 'phone':
$label_text = esc_attr__('Phone','asl_locator');
break;
case 'fax':
$label_text = esc_attr__('Fax','asl_locator');
break;
case 'email':
$label_text = esc_attr__('Email','asl_locator');
break;
case 'street':
$label_text = esc_attr__('Street','asl_locator');
break;
case 'postal_code':
$label_text = esc_attr__('Postal Code','asl_locator');
break;
case 'city':
$label_text = esc_attr__('City','asl_locator');
break;
case 'state':
$label_text = esc_attr__('State','asl_locator');
break;
case 'website':
$label_text = esc_attr__('Website','asl_locator');
break;
}
return $label_text;
}
}