oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/Common/Helper.php
2025-03-31 21:42:48 +02:00

482 lines
12 KiB
PHP

<?php
namespace CTXFeed\V5\Common;
use CTXFeed\V5\Product\AttributeValueByType;
use CTXFeed\V5\Utility\Logs;
use CTXFeed\V5\Utility\Settings;
/**
* Class Helper
*
* @package CTXFeed\V5\Common
* @subpackage CTXFeed\V5\Common
*/
class Helper
{
/**
* Object to array.
*
* @param object|array $obj
*
* @return array|object
*/
public static function object_to_array($obj)
{
//only process if it's an object or array being passed to the function
if (is_object($obj) || is_array($obj)) {
$arr = (array)$obj;
foreach ($arr as &$item) {
//recursively process EACH element regardless of type
$item = self::object_to_array($item);
}
return $arr;
} //otherwise (i.e. for scalar values) return without modification
return $obj;
}
/**
* Remove pro templates form merchant array.
*
* @param array $merchants
*
* @return array
*/
public static function filter_merchant($merchants)
{
if (WOO_FEED_PLUGIN_FILE === 'woo-feed.php') {
$removeTemplates = array('custom2');
foreach ($merchants as $index => $group) {
foreach ($group['options'] as $option_name => $option_value) {
if (in_array($option_name, $removeTemplates)) {
unset($merchants[$index]['options'][$option_name]);
}
}
}
}
return $merchants;
}
/**
* Get plugin file i.e woo-feed.php or webappick-product-feed-for-woocommerce-pro.php
* @return false|mixed|string
*/
public static function get_plugin_file()
{
return WOO_FEED_PLUGIN_FILE;
}
/**
* Is the plugin is pro
* @return bool
*/
public static function is_pro()
{
if ('woo-feed.php' === WOO_FEED_PLUGIN_FILE) {
return false;
}
//TODO CHECK IF LICENSE IS ACTIVE FOR MORE TRANSPARENCY.
if ('webappick-product-feed-for-woocommerce-pro.php' === WOO_FEED_PLUGIN_FILE) {
return true;
}
return false;
}
/**
* Get Feed Directory
*
* @param string $provider
* @param string $feedType
*
* @return string
*/
public static function get_file_dir($provider, $feedType)
{
$upload_dir = wp_get_upload_dir();
return apply_filters('woo_feed_file_dir', sprintf('%s/woo-feed/%s/%s/', $upload_dir['basedir'], $provider, $feedType), $provider, $feedType);
}
/**
* str_replace() wrapper with trim()
*
* @param mixed $search The value being searched for, otherwise known as the needle.
* An array may be used to designate multiple needles.
* @param mixed $replace The replacement value that replaces found search values.
* An array may be used to designate multiple replacements.
* @param mixed $subject The string or array being searched and replaced on,
* otherwise known as the haystack.
* @param string $charlist [optional]
* Optionally, the stripped characters can also be specified using the charlist parameter.
* Simply list all characters that you want to be stripped.
* With this you can specify a range of characters.
*
* @return array|string
*/
public static function str_replace_trim($search, $replace, $subject, $charlist = " \t\n\r\0\x0B")
{
$replaced = str_replace($search, $replace, $subject);
if (is_array($replaced)) {
return array_map(
function ($item) use ($charlist) {
return trim($item, $charlist);
},
$replaced
);
} else {
return trim($replaced, $charlist);
}
}
/**
* Remove Feed Option Name Prefix and return the slug
*
* @param string $feed_option_name
*
* @return string
*/
public static function extract_feed_option_name($feed_option_name)
{
return str_replace(array('wf_feed_', 'wf_config'), '', $feed_option_name);
}
/**
* Get Feed File URL
*
* @param string $fileName
* @param string $provider
* @param string $type
*
* @return string
*/
public static function get_file_url($fileName, $provider, $type)
{
$fileName = self::extract_feed_option_name($fileName);
$upload_dir = wp_get_upload_dir();
return esc_url(
sprintf(
'%s/woo-feed/%s/%s/%s.%s',
$upload_dir['baseurl'],
$provider,
$type,
$fileName,
$type
)
);
}
/**
* Get Feed File URL
*
* @param string $fileName
* @param string $provider
* @param string $type
*
* @return string
*/
public static function get_file($fileName, $provider, $type)
{
$fileName = self::extract_feed_option_name($fileName);
$path = self::get_file_path($provider, $type);
return sprintf('%s/%s.%s', untrailingslashit($path), $fileName, $type);
}
/**
* Get File Path for feed or the file upload path for the plugin to use.
*
* @param string $provider provider name.
* @param string $type feed file type.
*
* @return string
*/
public static function get_file_path($provider = '', $type = '')
{
$upload_dir = wp_get_upload_dir();
return sprintf('%s/woo-feed/%s/%s/', $upload_dir['basedir'], $provider, $type);
}
/**
* Remove temporary feed files
*
* @param array $config Feed config
* @param string $fileName feed file name.
*
* @return void
*/
public static function unlink_tempFiles($config, $fileName)
{
$type = $config['feedType'];
$ext = $type;
$path = self::get_file_dir($config['provider'], $type);
if ('csv' === $type || 'tsv' === $type || 'xls' === $type || 'xlsx' === $type) {
$ext = 'json';
}
$files = array(
'headerFile' => $path . '/' . AttributeValueByType::FEED_TEMP_HEADER_PREFIX . $fileName . '.' . $ext,
'bodyFile' => $path . '/' . AttributeValueByType::FEED_TEMP_BODY_PREFIX . $fileName . '.' . $ext,
'footerFile' => $path . '/' . AttributeValueByType::FEED_TEMP_FOOTER_PREFIX . $fileName . '.' . $ext,
);
Logs::write_log($config['filename'], sprintf('Deleting Temporary Files (%s).', implode(', ', array_values($files))));
foreach ($files as $key => $file) {
if (file_exists($file)) {
unlink($file); // phpcs:ignore
}
}
}
/**
* Clear cache data.
*
* @param int _ajax_clean_nonce nonce number.
*
* @since 4.1.2
*/
public static function clear_cache_data($cache_types = [])
{
if (empty($cache_options)) {
$cache_types = [
"woo_feed_attributes",
"woo_feed_category_mapping",
"woo_feed_dynamic_attributes",
"woo_feed_attribute_mapping",
"woo_feed_wp_options"
];
}
global $wpdb;
//TODO add wpdb prepare statement
$result = $wpdb->query("DELETE FROM $wpdb->options WHERE ({$wpdb->options}.option_name LIKE '_transient_timeout___woo_feed_cache_%') OR ({$wpdb->options}.option_name LIKE '_transient___woo_feed_cache_%')"); // phpcs:ignore
if (count($cache_types) > 0) {
$prefix = 'wf_dismissed';
foreach ($cache_types as $value) {
$id = $value;
update_option("{$prefix}_{$id}", true, false);
}
}
return true;
}
/**
* Get Sellers User Role Based On Multi Vendor Plugin
*
* @return string
*/
public static function get_multi_vendor_user_role()
{
$map = array(
'WeDevs_Dokan' => 'seller',
'WC_Vendors' => 'vendor',
'YITH_Vendor' => 'yith_vendor',
'MVX' => 'dc_vendor',
'WCFMmp' => 'wcfm_vendor',
);
$vendor_role = '';
foreach ($map as $class => $role) {
if (class_exists($class, false)) {
$vendor_role = $role;
break;
}
}
/**
* Filter Vendor User Role
*
* @param string $vendor_role
*
* @since 3.4.0
*/
return apply_filters('woo_feed_multi_vendor_user_role', $vendor_role);
}
public static function is_debugging_enabled()
{
return self::get_options('enable_error_debugging', false) === 'on';
}
/**
* Get saved settings.
*
* @param string $key Option name.
* All default values will be returned if this set to 'defaults',
* all settings will be return if set to 'all'.
* @param bool $default value to return if no matching data found for the key (option)
*
* @return array|bool|string|mixed
* @since 3.3.11
*/
public static function get_options($key, $default = false)
{
$defaults = array(
'per_batch' => 200,
'product_query_type' => 'wc',
'variation_query_type' => 'individual',
'enable_error_debugging' => 'off',
'cache_ttl' => 6 * HOUR_IN_SECONDS,
'overridden_structured_data' => 'off',
'disable_mpn' => 'enable',
'disable_brand' => 'enable',
'disable_pixel' => 'enable',
'pixel_id' => '',
'disable_remarketing' => 'disable',
'remarketing_id' => '',
'remarketing_label' => '',
'allow_all_shipping' => 'no',
'only_free_shipping' => 'yes',
'only_local_pickup_shipping' => 'no',
'enable_ftp_upload' => 'no',
'enable_cdata' => 'no',
'woo_feed_taxonomy' => array(
'brand' => 'disable',
),
'woo_feed_identifier' => array(
'gtin' => 'disable',
'ean' => 'disable',
'mpn' => 'disable',
'isbn' => 'disable',
'age_group' => 'disable',
'material' => 'disable',
'gender' => 'disable',
'cost_of_good_sold' => 'disable',
'availability_date' => 'enable',
'unit' => 'disable',
'unit_pricing_measure' => 'disable',
'unit_pricing_base_measure' => 'disable',
'custom_field_0' => 'disable',
'custom_field_1' => 'disable',
'custom_field_2' => 'disable',
'custom_field_3' => 'disable',
'custom_field_4' => 'disable',
),
);
/**
* Add defaults without chainging the core values.
*
* @param array $defaults
*
* @since 3.3.11
*/
$defaults = wp_parse_args(apply_filters('woo_feed_settings_extra_defaults', array()), $defaults);
if ('defaults' === $key) {
return $defaults;
}
$settings = wp_parse_args(get_option('woo_feed_settings', array()), $defaults);
if ('all' === $key) {
return $settings;
}
if (array_key_exists($key, $settings)) {
return $settings[$key];
}
return $default;
}
/**
* Remove Option Name Prefix and return the slug
*
* @param string $feed_option_name
*
* @return string
*/
public static function extract_option_name($feed_option_name, $prefix)
{
return str_replace(array($prefix), '', $feed_option_name);
}
public static function access_protected_props_and_methods($obj, $prop)
{
$reflection = new \ReflectionClass($obj);
$property = $reflection->getProperty($prop);
$property->setAccessible(true);
return $property->getValue($obj);
}
/**
* Get Formatted URL
*
* @param string $url
*
* @return string
*/
public static function woo_feed_get_formatted_url($url = '')
{
if (!empty($url)) {
if (substr(trim($url), 0, 4) === 'http' || substr(
trim($url),
0,
3
) === 'ftp' || substr(trim($url), 0, 4) === 'sftp') {
$url = str_replace(' ', '%20', $url);
return rtrim($url, '/');
} else {
$base = get_site_url();
$url = str_replace(' ', '%20', $url);
$url = $base . $url;
return rtrim($url, '/');
}
}
return '';
}
/**
* We've introduced a better system to handle the cron job. You can read more about it here
* libs/webappick-product-feed-for-woocommerce/V5/Helper/CronHelper.php
* But this feature works only if the WP_CRON is enabled.
* That's why we've checked here if the WP_CRON is enabled or not.
* If WP_Cron is disabled then initialize old cron system by including the cron-helper.php file.
*
* Some users are claiming that the new cron system is not working for them. So, we've added a filter to enable/disable the new cron system.
* When new cron system is disabled, the old cron system will be initialized.
*
* @link : https://webappick.atlassian.net/browse/CBT-363
*
* since 7.3.11
*/
public static function should_init_new_cron_system()
{
$should_init_new_cron_system = false;
if (!defined('DISABLE_WP_CRON') || !DISABLE_WP_CRON) {
$should_init_new_cron_system = true;
}
$cron_job_new_cron_system_enabled = Settings::get('cron_job_new_cron_system_enabled', true);
if (!$cron_job_new_cron_system_enabled) {
$should_init_new_cron_system = false;
}
return apply_filters('ctx_feed_should_init_new_cron_system', $should_init_new_cron_system);
}
public static function ctx_feed_has_composite_product_plugin() {
return (
class_exists( 'WC_Product_Composite', false ) ||
class_exists( 'WC_Product_Yith_Composite', false )
);
}
}