Gel all possible locales as array in PHP

if ( ! function_exists( 'get_all_locales_array' ) ) {
	/**
	 * get_all_locales_array.
	 */
	function get_all_locales_array() {
		return array(
			'af_NA'       => 'Afrikaans (Namibia)',
			'af_ZA'       => 'Afrikaans (South Africa)',
			'af'          => 'Afrikaans',
			'ak_GH'       => 'Akan (Ghana)',
			'ak'          => 'Akan',
			'sq_AL'       => 'Albanian (Albania)',
			'sq'          => 'Albanian',
			'am_ET'       => 'Amharic (Ethiopia)',
			'am'          => 'Amharic',
			'ar_DZ'       => 'Arabic (Algeria)',
			'ar_BH'       => 'Arabic (Bahrain)',
			'ar_EG'       => 'Arabic (Egypt)',
			'ar_IQ'       => 'Arabic (Iraq)',
			'ar_JO'       => 'Arabic (Jordan)',
			'ar_KW'       => 'Arabic (Kuwait)',
			'ar_LB'       => 'Arabic (Lebanon)',
			'ar_LY'       => 'Arabic (Libya)',
			'ar_MA'       => 'Arabic (Morocco)',
			'ar_OM'       => 'Arabic (Oman)',
			'ar_QA'       => 'Arabic (Qatar)',
			'ar_SA'       => 'Arabic (Saudi Arabia)',
			'ar_SD'       => 'Arabic (Sudan)',
			'ar_SY'       => 'Arabic (Syria)',
			'ar_TN'       => 'Arabic (Tunisia)',
			'ar_AE'       => 'Arabic (United Arab Emirates)',
			'ar_YE'       => 'Arabic (Yemen)',
			'ar'          => 'Arabic',
			'hy_AM'       => 'Armenian (Armenia)',
			'hy'          => 'Armenian',
			'as_IN'       => 'Assamese (India)',
			'as'          => 'Assamese',
			'asa_TZ'      => 'Asu (Tanzania)',
			'asa'         => 'Asu',
			'az_Cyrl'     => 'Azerbaijani (Cyrillic)',
			'az_Cyrl_AZ'  => 'Azerbaijani (Cyrillic, Azerbaijan)',
			'az_Latn'     => 'Azerbaijani (Latin)',
			'az_Latn_AZ'  => 'Azerbaijani (Latin, Azerbaijan)',
			'az'          => 'Azerbaijani',
			'bm_ML'       => 'Bambara (Mali)',
			'bm'          => 'Bambara',
			'eu_ES'       => 'Basque (Spain)',
			'eu'          => 'Basque',
			'be_BY'       => 'Belarusian (Belarus)',
			'be'          => 'Belarusian',
			'bem_ZM'      => 'Bemba (Zambia)',
			'bem'         => 'Bemba',
			'bez_TZ'      => 'Bena (Tanzania)',
			'bez'         => 'Bena',
			'bn_BD'       => 'Bengali (Bangladesh)',
			'bn_IN'       => 'Bengali (India)',
			'bn'          => 'Bengali',
			'bs_BA'       => 'Bosnian (Bosnia and Herzegovina)',
			'bs'          => 'Bosnian',
			'bg_BG'       => 'Bulgarian (Bulgaria)',
			'bg'          => 'Bulgarian',
			'my_MM'       => 'Burmese (Myanmar [Burma])',
			'my'          => 'Burmese',
			'ca_ES'       => 'Catalan (Spain)',
			'ca'          => 'Catalan',
			'tzm_Latn'    => 'Central Morocco Tamazight (Latin)',
			'tzm_Latn_MA' => 'Central Morocco Tamazight (Latin, Morocco)',
			'tzm'         => 'Central Morocco Tamazight',
			'chr_US'      => 'Cherokee (United States)',
			'chr'         => 'Cherokee',
			'cgg_UG'      => 'Chiga (Uganda)',
			'cgg'         => 'Chiga',
			'zh_Hans'     => 'Chinese (Simplified Han)',
			'zh_Hans_CN'  => 'Chinese (Simplified Han, China)',
			'zh_Hans_HK'  => 'Chinese (Simplified Han, Hong Kong SAR China)',
			'zh_Hans_MO'  => 'Chinese (Simplified Han, Macau SAR China)',
			'zh_Hans_SG'  => 'Chinese (Simplified Han, Singapore)',
			'zh_Hant'     => 'Chinese (Traditional Han)',
			'zh_Hant_HK'  => 'Chinese (Traditional Han, Hong Kong SAR China)',
			'zh_Hant_MO'  => 'Chinese (Traditional Han, Macau SAR China)',
			'zh_Hant_TW'  => 'Chinese (Traditional Han, Taiwan)',
			'zh'          => 'Chinese',
			'kw_GB'       => 'Cornish (United Kingdom)',
			'kw'          => 'Cornish',
			'hr_HR'       => 'Croatian (Croatia)',
			'hr'          => 'Croatian',
			'cs_CZ'       => 'Czech (Czech Republic)',
			'cs'          => 'Czech',
			'da_DK'       => 'Danish (Denmark)',
			'da'          => 'Danish',
			'nl_BE'       => 'Dutch (Belgium)',
			'nl_NL'       => 'Dutch (Netherlands)',
			'nl'          => 'Dutch',
			'ebu_KE'      => 'Embu (Kenya)',
			'ebu'         => 'Embu',
			'en_AS'       => 'English (American Samoa)',
			'en_AU'       => 'English (Australia)',
			'en_BE'       => 'English (Belgium)',
			'en_BZ'       => 'English (Belize)',
			'en_BW'       => 'English (Botswana)',
			'en_CA'       => 'English (Canada)',
			'en_GU'       => 'English (Guam)',
			'en_HK'       => 'English (Hong Kong SAR China)',
			'en_IN'       => 'English (India)',
			'en_IE'       => 'English (Ireland)',
			'en_JM'       => 'English (Jamaica)',
			'en_MT'       => 'English (Malta)',
			'en_MH'       => 'English (Marshall Islands)',
			'en_MU'       => 'English (Mauritius)',
			'en_NA'       => 'English (Namibia)',
			'en_NZ'       => 'English (New Zealand)',
			'en_MP'       => 'English (Northern Mariana Islands)',
			'en_PK'       => 'English (Pakistan)',
			'en_PH'       => 'English (Philippines)',
			'en_SG'       => 'English (Singapore)',
			'en_ZA'       => 'English (South Africa)',
			'en_TT'       => 'English (Trinidad and Tobago)',
			'en_UM'       => 'English (U.S. Minor Outlying Islands)',
			'en_VI'       => 'English (U.S. Virgin Islands)',
			'en_GB'       => 'English (United Kingdom)',
			'en_US'       => 'English (United States)',
			'en_ZW'       => 'English (Zimbabwe)',
			'en'          => 'English',
			'eo'          => 'Esperanto',
			'et_EE'       => 'Estonian (Estonia)',
			'et'          => 'Estonian',
			'ee_GH'       => 'Ewe (Ghana)',
			'ee_TG'       => 'Ewe (Togo)',
			'ee'          => 'Ewe',
			'fo_FO'       => 'Faroese (Faroe Islands)',
			'fo'          => 'Faroese',
			'fil_PH'      => 'Filipino (Philippines)',
			'fil'         => 'Filipino',
			'fi_FI'       => 'Finnish (Finland)',
			'fi'          => 'Finnish',
			'fr_BE'       => 'French (Belgium)',
			'fr_BJ'       => 'French (Benin)',
			'fr_BF'       => 'French (Burkina Faso)',
			'fr_BI'       => 'French (Burundi)',
			'fr_CM'       => 'French (Cameroon)',
			'fr_CA'       => 'French (Canada)',
			'fr_CF'       => 'French (Central African Republic)',
			'fr_TD'       => 'French (Chad)',
			'fr_KM'       => 'French (Comoros)',
			'fr_CG'       => 'French (Congo - Brazzaville)',
			'fr_CD'       => 'French (Congo - Kinshasa)',
			'fr_CI'       => 'French (Côte d’Ivoire)',
			'fr_DJ'       => 'French (Djibouti)',
			'fr_GQ'       => 'French (Equatorial Guinea)',
			'fr_FR'       => 'French (France)',
			'fr_GA'       => 'French (Gabon)',
			'fr_GP'       => 'French (Guadeloupe)',
			'fr_GN'       => 'French (Guinea)',
			'fr_LU'       => 'French (Luxembourg)',
			'fr_MG'       => 'French (Madagascar)',
			'fr_ML'       => 'French (Mali)',
			'fr_MQ'       => 'French (Martinique)',
			'fr_MC'       => 'French (Monaco)',
			'fr_NE'       => 'French (Niger)',
			'fr_RW'       => 'French (Rwanda)',
			'fr_RE'       => 'French (Réunion)',
			'fr_BL'       => 'French (Saint Barthélemy)',
			'fr_MF'       => 'French (Saint Martin)',
			'fr_SN'       => 'French (Senegal)',
			'fr_CH'       => 'French (Switzerland)',
			'fr_TG'       => 'French (Togo)',
			'fr'          => 'French',
			'ff_SN'       => 'Fulah (Senegal)',
			'ff'          => 'Fulah',
			'gl_ES'       => 'Galician (Spain)',
			'gl'          => 'Galician',
			'lg_UG'       => 'Ganda (Uganda)',
			'lg'          => 'Ganda',
			'ka_GE'       => 'Georgian (Georgia)',
			'ka'          => 'Georgian',
			'de_AT'       => 'German (Austria)',
			'de_BE'       => 'German (Belgium)',
			'de_DE'       => 'German (Germany)',
			'de_LI'       => 'German (Liechtenstein)',
			'de_LU'       => 'German (Luxembourg)',
			'de_CH'       => 'German (Switzerland)',
			'de'          => 'German',
			'el_CY'       => 'Greek (Cyprus)',
			'el_GR'       => 'Greek (Greece)',
			'el'          => 'Greek',
			'gu_IN'       => 'Gujarati (India)',
			'gu'          => 'Gujarati',
			'guz_KE'      => 'Gusii (Kenya)',
			'guz'         => 'Gusii',
			'ha_Latn'     => 'Hausa (Latin)',
			'ha_Latn_GH'  => 'Hausa (Latin, Ghana)',
			'ha_Latn_NE'  => 'Hausa (Latin, Niger)',
			'ha_Latn_NG'  => 'Hausa (Latin, Nigeria)',
			'ha'          => 'Hausa',
			'haw_US'      => 'Hawaiian (United States)',
			'haw'         => 'Hawaiian',
			'he_IL'       => 'Hebrew (Israel)',
			'he'          => 'Hebrew',
			'hi_IN'       => 'Hindi (India)',
			'hi'          => 'Hindi',
			'hu_HU'       => 'Hungarian (Hungary)',
			'hu'          => 'Hungarian',
			'is_IS'       => 'Icelandic (Iceland)',
			'is'          => 'Icelandic',
			'ig_NG'       => 'Igbo (Nigeria)',
			'ig'          => 'Igbo',
			'id_ID'       => 'Indonesian (Indonesia)',
			'id'          => 'Indonesian',
			'ga_IE'       => 'Irish (Ireland)',
			'ga'          => 'Irish',
			'it_IT'       => 'Italian (Italy)',
			'it_CH'       => 'Italian (Switzerland)',
			'it'          => 'Italian',
			'ja_JP'       => 'Japanese (Japan)',
			'ja'          => 'Japanese',
			'kea_CV'      => 'Kabuverdianu (Cape Verde)',
			'kea'         => 'Kabuverdianu',
			'kab_DZ'      => 'Kabyle (Algeria)',
			'kab'         => 'Kabyle',
			'kl_GL'       => 'Kalaallisut (Greenland)',
			'kl'          => 'Kalaallisut',
			'kln_KE'      => 'Kalenjin (Kenya)',
			'kln'         => 'Kalenjin',
			'kam_KE'      => 'Kamba (Kenya)',
			'kam'         => 'Kamba',
			'kn_IN'       => 'Kannada (India)',
			'kn'          => 'Kannada',
			'kk_Cyrl'     => 'Kazakh (Cyrillic)',
			'kk_Cyrl_KZ'  => 'Kazakh (Cyrillic, Kazakhstan)',
			'kk'          => 'Kazakh',
			'km_KH'       => 'Khmer (Cambodia)',
			'km'          => 'Khmer',
			'ki_KE'       => 'Kikuyu (Kenya)',
			'ki'          => 'Kikuyu',
			'rw_RW'       => 'Kinyarwanda (Rwanda)',
			'rw'          => 'Kinyarwanda',
			'kok_IN'      => 'Konkani (India)',
			'kok'         => 'Konkani',
			'ko_KR'       => 'Korean (South Korea)',
			'ko'          => 'Korean',
			'khq_ML'      => 'Koyra Chiini (Mali)',
			'khq'         => 'Koyra Chiini',
			'ses_ML'      => 'Koyraboro Senni (Mali)',
			'ses'         => 'Koyraboro Senni',
			'lag_TZ'      => 'Langi (Tanzania)',
			'lag'         => 'Langi',
			'lv_LV'       => 'Latvian (Latvia)',
			'lv'          => 'Latvian',
			'lt_LT'       => 'Lithuanian (Lithuania)',
			'lt'          => 'Lithuanian',
			'luo_KE'      => 'Luo (Kenya)',
			'luo'         => 'Luo',
			'luy_KE'      => 'Luyia (Kenya)',
			'luy'         => 'Luyia',
			'mk_MK'       => 'Macedonian (Macedonia)',
			'mk'          => 'Macedonian',
			'jmc_TZ'      => 'Machame (Tanzania)',
			'jmc'         => 'Machame',
			'kde_TZ'      => 'Makonde (Tanzania)',
			'kde'         => 'Makonde',
			'mg_MG'       => 'Malagasy (Madagascar)',
			'mg'          => 'Malagasy',
			'ms_BN'       => 'Malay (Brunei)',
			'ms_MY'       => 'Malay (Malaysia)',
			'ms'          => 'Malay',
			'ml_IN'       => 'Malayalam (India)',
			'ml'          => 'Malayalam',
			'mt_MT'       => 'Maltese (Malta)',
			'mt'          => 'Maltese',
			'gv_GB'       => 'Manx (United Kingdom)',
			'gv'          => 'Manx',
			'mr_IN'       => 'Marathi (India)',
			'mr'          => 'Marathi',
			'mas_KE'      => 'Masai (Kenya)',
			'mas_TZ'      => 'Masai (Tanzania)',
			'mas'         => 'Masai',
			'mer_KE'      => 'Meru (Kenya)',
			'mer'         => 'Meru',
			'mfe_MU'      => 'Morisyen (Mauritius)',
			'mfe'         => 'Morisyen',
			'naq_NA'      => 'Nama (Namibia)',
			'naq'         => 'Nama',
			'ne_IN'       => 'Nepali (India)',
			'ne_NP'       => 'Nepali (Nepal)',
			'ne'          => 'Nepali',
			'nd_ZW'       => 'North Ndebele (Zimbabwe)',
			'nd'          => 'North Ndebele',
			'nb_NO'       => 'Norwegian Bokmål (Norway)',
			'nb'          => 'Norwegian Bokmål',
			'nn_NO'       => 'Norwegian Nynorsk (Norway)',
			'nn'          => 'Norwegian Nynorsk',
			'nyn_UG'      => 'Nyankole (Uganda)',
			'nyn'         => 'Nyankole',
			'or_IN'       => 'Oriya (India)',
			'or'          => 'Oriya',
			'om_ET'       => 'Oromo (Ethiopia)',
			'om_KE'       => 'Oromo (Kenya)',
			'om'          => 'Oromo',
			'ps_AF'       => 'Pashto (Afghanistan)',
			'ps'          => 'Pashto',
			'fa_AF'       => 'Persian (Afghanistan)',
			'fa_IR'       => 'Persian (Iran)',
			'fa'          => 'Persian',
			'pl_PL'       => 'Polish (Poland)',
			'pl'          => 'Polish',
			'pt_BR'       => 'Portuguese (Brazil)',
			'pt_GW'       => 'Portuguese (Guinea-Bissau)',
			'pt_MZ'       => 'Portuguese (Mozambique)',
			'pt_PT'       => 'Portuguese (Portugal)',
			'pt'          => 'Portuguese',
			'pa_Arab'     => 'Punjabi (Arabic)',
			'pa_Arab_PK'  => 'Punjabi (Arabic, Pakistan)',
			'pa_Guru'     => 'Punjabi (Gurmukhi)',
			'pa_Guru_IN'  => 'Punjabi (Gurmukhi, India)',
			'pa'          => 'Punjabi',
			'ro_MD'       => 'Romanian (Moldova)',
			'ro_RO'       => 'Romanian (Romania)',
			'ro'          => 'Romanian',
			'rm_CH'       => 'Romansh (Switzerland)',
			'rm'          => 'Romansh',
			'rof_TZ'      => 'Rombo (Tanzania)',
			'rof'         => 'Rombo',
			'ru_MD'       => 'Russian (Moldova)',
			'ru_RU'       => 'Russian (Russia)',
			'ru_UA'       => 'Russian (Ukraine)',
			'ru'          => 'Russian',
			'rwk_TZ'      => 'Rwa (Tanzania)',
			'rwk'         => 'Rwa',
			'saq_KE'      => 'Samburu (Kenya)',
			'saq'         => 'Samburu',
			'sg_CF'       => 'Sango (Central African Republic)',
			'sg'          => 'Sango',
			'seh_MZ'      => 'Sena (Mozambique)',
			'seh'         => 'Sena',
			'sr_Cyrl'     => 'Serbian (Cyrillic)',
			'sr_Cyrl_BA'  => 'Serbian (Cyrillic, Bosnia and Herzegovina)',
			'sr_Cyrl_ME'  => 'Serbian (Cyrillic, Montenegro)',
			'sr_Cyrl_RS'  => 'Serbian (Cyrillic, Serbia)',
			'sr_Latn'     => 'Serbian (Latin)',
			'sr_Latn_BA'  => 'Serbian (Latin, Bosnia and Herzegovina)',
			'sr_Latn_ME'  => 'Serbian (Latin, Montenegro)',
			'sr_Latn_RS'  => 'Serbian (Latin, Serbia)',
			'sr'          => 'Serbian',
			'sn_ZW'       => 'Shona (Zimbabwe)',
			'sn'          => 'Shona',
			'ii_CN'       => 'Sichuan Yi (China)',
			'ii'          => 'Sichuan Yi',
			'si_LK'       => 'Sinhala (Sri Lanka)',
			'si'          => 'Sinhala',
			'sk_SK'       => 'Slovak (Slovakia)',
			'sk'          => 'Slovak',
			'sl_SI'       => 'Slovenian (Slovenia)',
			'sl'          => 'Slovenian',
			'xog_UG'      => 'Soga (Uganda)',
			'xog'         => 'Soga',
			'so_DJ'       => 'Somali (Djibouti)',
			'so_ET'       => 'Somali (Ethiopia)',
			'so_KE'       => 'Somali (Kenya)',
			'so_SO'       => 'Somali (Somalia)',
			'so'          => 'Somali',
			'es_AR'       => 'Spanish (Argentina)',
			'es_BO'       => 'Spanish (Bolivia)',
			'es_CL'       => 'Spanish (Chile)',
			'es_CO'       => 'Spanish (Colombia)',
			'es_CR'       => 'Spanish (Costa Rica)',
			'es_DO'       => 'Spanish (Dominican Republic)',
			'es_EC'       => 'Spanish (Ecuador)',
			'es_SV'       => 'Spanish (El Salvador)',
			'es_GQ'       => 'Spanish (Equatorial Guinea)',
			'es_GT'       => 'Spanish (Guatemala)',
			'es_HN'       => 'Spanish (Honduras)',
			'es_419'      => 'Spanish (Latin America)',
			'es_MX'       => 'Spanish (Mexico)',
			'es_NI'       => 'Spanish (Nicaragua)',
			'es_PA'       => 'Spanish (Panama)',
			'es_PY'       => 'Spanish (Paraguay)',
			'es_PE'       => 'Spanish (Peru)',
			'es_PR'       => 'Spanish (Puerto Rico)',
			'es_ES'       => 'Spanish (Spain)',
			'es_US'       => 'Spanish (United States)',
			'es_UY'       => 'Spanish (Uruguay)',
			'es_VE'       => 'Spanish (Venezuela)',
			'es'          => 'Spanish',
			'sw_KE'       => 'Swahili (Kenya)',
			'sw_TZ'       => 'Swahili (Tanzania)',
			'sw'          => 'Swahili',
			'sv_FI'       => 'Swedish (Finland)',
			'sv_SE'       => 'Swedish (Sweden)',
			'sv'          => 'Swedish',
			'gsw_CH'      => 'Swiss German (Switzerland)',
			'gsw'         => 'Swiss German',
			'shi_Latn'    => 'Tachelhit (Latin)',
			'shi_Latn_MA' => 'Tachelhit (Latin, Morocco)',
			'shi_Tfng'    => 'Tachelhit (Tifinagh)',
			'shi_Tfng_MA' => 'Tachelhit (Tifinagh, Morocco)',
			'shi'         => 'Tachelhit',
			'dav_KE'      => 'Taita (Kenya)',
			'dav'         => 'Taita',
			'ta_IN'       => 'Tamil (India)',
			'ta_LK'       => 'Tamil (Sri Lanka)',
			'ta'          => 'Tamil',
			'te_IN'       => 'Telugu (India)',
			'te'          => 'Telugu',
			'teo_KE'      => 'Teso (Kenya)',
			'teo_UG'      => 'Teso (Uganda)',
			'teo'         => 'Teso',
			'th_TH'       => 'Thai (Thailand)',
			'th'          => 'Thai',
			'bo_CN'       => 'Tibetan (China)',
			'bo_IN'       => 'Tibetan (India)',
			'bo'          => 'Tibetan',
			'ti_ER'       => 'Tigrinya (Eritrea)',
			'ti_ET'       => 'Tigrinya (Ethiopia)',
			'ti'          => 'Tigrinya',
			'to_TO'       => 'Tonga (Tonga)',
			'to'          => 'Tonga',
			'tr_TR'       => 'Turkish (Turkey)',
			'tr'          => 'Turkish',
			'uk_UA'       => 'Ukrainian (Ukraine)',
			'uk'          => 'Ukrainian',
			'ur_IN'       => 'Urdu (India)',
			'ur_PK'       => 'Urdu (Pakistan)',
			'ur'          => 'Urdu',
			'uz_Arab'     => 'Uzbek (Arabic)',
			'uz_Arab_AF'  => 'Uzbek (Arabic, Afghanistan)',
			'uz_Cyrl'     => 'Uzbek (Cyrillic)',
			'uz_Cyrl_UZ'  => 'Uzbek (Cyrillic, Uzbekistan)',
			'uz_Latn'     => 'Uzbek (Latin)',
			'uz_Latn_UZ'  => 'Uzbek (Latin, Uzbekistan)',
			'uz'          => 'Uzbek',
			'vi_VN'       => 'Vietnamese (Vietnam)',
			'vi'          => 'Vietnamese',
			'vun_TZ'      => 'Vunjo (Tanzania)',
			'vun'         => 'Vunjo',
			'cy_GB'       => 'Welsh (United Kingdom)',
			'cy'          => 'Welsh',
			'yo_NG'       => 'Yoruba (Nigeria)',
			'yo'          => 'Yoruba',
			'zu_ZA'       => 'Zulu (South Africa)',
			'zu'          => 'Zulu',
		);
	}
}

Check if product is in cart by product ID in WooCommerce

if ( ! function_exists( 'is_product_in_cart' ) ) {
	/**
	 * is_product_in_cart.
	 *
	 * @return bool
	 */
	function is_product_in_cart( $product_id ) {
		if ( 0 != $product_id ) {
			if ( isset( WC()->cart->cart_contents ) && is_array( WC()->cart->cart_contents ) ) {
				foreach ( WC()->cart->cart_contents as $cart_item_key => $cart_item_data ) {
					if (
						( isset( $cart_item_data['product_id'] )   && $product_id == $cart_item_data['product_id'] ) ||
						( isset( $cart_item_data['variation_id'] ) && $product_id == $cart_item_data['variation_id'] )
					) {
						return true;
					}
				}
			}
		}
		return false;
	}
}

Generate random string in PHP

if ( ! function_exists( 'generate_random_string' ) ) {
	/*
	 * Generates random string
	 */
	function generate_random_string( $length, $do_include_uppercase = true, $do_include_numbers = true ) {
		// Form available characters string
		$chars = 'abcdefghijklmnopqrstuvwxyz';
		if ( $do_include_uppercase ) {
			$chars .= strtoupper( $chars );
		}
		if ( $do_include_numbers ) {
			$chars .= '0123456789';
		}
		$chars_length = strlen( $chars );
		// Generate random string
		$random_string = '';
		for ( $i = 1; $i <= $length; $i++ ) {
			$random_string .= $chars[ rand( 0, $chars_length - 1 ) ];
		}
		return $random_string;
	}
}

Add order complete action to WooCommerce My Orders customer table

if ( ! function_exists( 'wcj_add_my_account_order_actions' ) ) {
	/*
	 * wcj_add_my_account_order_actions.
	 */
	function wcj_add_my_account_order_actions( $actions, $order ) {
		if ( 'completed' != $order->get_status() ) {
			$actions['wcj_mark_completed_by_customer'] = array(
				'url'  => wp_nonce_url( add_query_arg( array(
					'wcj_action' => 'wcj_woocommerce_mark_order_status',
					'order_id'   => $order->get_id() ) ), 'wcj-woocommerce-mark-order-status' ),
				'name' => __( 'Complete', 'woocommerce-jetpack' ),
			);
		}
		return $actions;
	}
}
add_filter( 'woocommerce_my_account_my_orders_actions', 'wcj_add_my_account_order_actions', 10, 2 );
if ( ! function_exists( 'wcj_add_js_conformation' ) ) {
	/*
	 * wcj_add_js_conformation.
	 */
	function wcj_add_js_conformation() {
		echo '<script>
			jQuery("a.wcj_mark_completed_by_customer").each( function() { jQuery(this).attr("onclick", "return confirm(\'' . __( 'Are you sure?', 'woocommerce-jetpack' ) . '\')") } );
		</script>';
	}
}
add_action( 'wp_footer', 'wcj_add_js_conformation' );
if ( ! function_exists( 'wcj_woocommerce_mark_order_status' ) ) {
	/*
	 * wcj_woocommerce_mark_order_status.
	 */
	function wcj_woocommerce_mark_order_status() {
		if ( isset( $_GET['wcj_action'] ) && 'wcj_woocommerce_mark_order_status' === $_GET['wcj_action'] && isset( $_GET['order_id'] ) && isset( $_GET['_wpnonce'] ) ) {
			if ( wp_verify_nonce( $_GET['_wpnonce'], 'wcj-woocommerce-mark-order-status' ) ) {
				$_order = wc_get_order( $_GET['order_id'] );
				if ( $_order->get_customer_id() === get_current_user_id() ) {
					$_order->update_status( 'completed' );
					wp_safe_redirect( remove_query_arg( array( 'wcj_action', 'order_id', '_wpnonce' ) ) );
					exit;
				}
			}
		}
	}
}
add_action( 'init', 'wcj_woocommerce_mark_order_status' );