rename = tinv_get_option( 'rename', 'rename' ); $this->rename_single = tinv_get_option( 'rename', 'rename_single' ); $this->rename_plural = tinv_get_option( 'rename', 'rename_plural' ); if ( $this->rename && $this->rename_single ) { add_filter( 'gettext', array( $this, 'translations' ), 999, 3 ); add_filter( 'ngettext', array( $this, 'translations_n' ), 999, 5 ); } } function translations_n( $translation, $single, $plural, $number, $domain ) { return $this->translation_update( $translation, $domain ); } function translations( $translation, $text, $domain ) { return $this->translation_update( $translation, $domain ); } private function translation_update( $text, $domain ) { if ( 'ti-woocommerce-wishlist' === $domain ) { if ( strpos( $text, '{wishlist_title}' ) !== false ) { // If $text contains "{wishlist_title}", skip the replacement return $text; } $translations = [ 'wishlist' => [ $this->rename_single, $this->rename_plural ? $this->rename_plural : $this->rename_single . 's' ] ]; $text = preg_replace_callback( '~\b[a-z]+(?:(?<=(s)))?~i', function ( $m ) use ( $translations ) { $lower = strtolower( $m[0] ); $rep = $m[0]; if ( isset( $translations[ $lower ] ) ) { $rep = is_array( $translations[ $lower ] ) ? $translations[ $lower ][0] : $translations[ $lower ]; } elseif ( isset( $m[1] ) ) { $sing = substr( $lower, 0, - 1 ); if ( isset( $translations[ $sing ] ) ) { $rep = is_array( $translations[ $sing ] ) ? $translations[ $sing ][1] : $translations[ $sing ] . 's'; } } else { return $rep; } if ( $m[0] == $lower ) { return $rep; } elseif ( $m[0] == strtoupper( $lower ) ) { return strtoupper( $rep ); } elseif ( $m[0] == ucfirst( $lower ) ) { return ucfirst( $rep ); } return $rep; }, $text ); } return $text; } } $tinvwl_rename = new TInvWLRename(); $tinvwl_rename->rename(); if ( ! function_exists( 'tinv_wishlist_template' ) ) { /** * The function overwrites the method output templates woocommerce * * @param string $template_name Name file template. * @param array $args Array variable in template. * @param string $template_path Customization path. */ function tinv_wishlist_template( $template_name, $args = array(), $template_path = '' ) { if ( function_exists( 'wc_get_template' ) ) { wc_get_template( $template_name, $args, $template_path ); } else { woocommerce_get_template( $template_name, $args, $template_path ); } } } if ( ! function_exists( 'tinv_wishlist_locate_template' ) ) { /** * Overwrites path for email and other template * * @param string $template_name Requered Template file. * @param string $template_path Template path. * @param string $default_path Template default path. * * @return mixed */ function tinv_wishlist_locate_template( $template_name, $template_path = '', $default_path = '' ) { $prefix = 'ti-'; if ( substr( basename( $template_name ), 0, strlen( $prefix ) ) !== $prefix ) { return; } if ( ! $template_path ) { $template_path = WC()->template_path(); } if ( ! $default_path ) { $default_path = TINVWL_PATH . DIRECTORY_SEPARATOR . 'templates' . DIRECTORY_SEPARATOR; } // Look within passed path within the theme - this is priority. $template = locate_template( array( trailingslashit( $template_path ) . $template_name, $template_name, ) ); // Get default template. if ( ! $template && file_exists( $default_path . $template_name ) ) { $template = $default_path . $template_name; } // Return what we found. return apply_filters( 'tinvwl_locate_template', $template, $template_name, $template_path ); } } // End if(). if ( ! function_exists( 'tinv_wishlist_template_html' ) ) { /** * The function overwrites the method return templates woocommerce * * @param string $template_name Name file template. * @param array $args Array variable in template. * @param string $template_path Customization path. * * @return string */ function tinv_wishlist_template_html( $template_name, $args = array(), $template_path = '' ) { ob_start(); tinv_wishlist_template( $template_name, $args, $template_path ); return ob_get_clean(); } } if ( ! function_exists( 'tinv_wishlist_get_item_data' ) ) { /** * Extract meta attributes for product * * @param object $product Object selected product. * @param array $wl_product Wishlist selected product. * @param boolean $flat Return text or template. * * @return string */ function tinv_wishlist_get_item_data( $product, $wl_product = array(), $flat = false ) { $item_data = array(); $variation_id = $product->is_type( 'variation' ) ? $product->get_id() : 0; $variation_data = $product->is_type( 'variation' ) ? wc_get_product_variation_attributes( $product->get_id() ) : array(); if ( ! empty( $variation_id ) && is_array( $variation_data ) && is_array( $wl_product ) ) { foreach ( $variation_data as $name => $value ) { if ( '' === $value ) { // Could be any value that saved to a custom meta. if ( array_key_exists( 'meta', $wl_product ) && array_key_exists( $name, $wl_product['meta'] ) ) { $value = $wl_product['meta'][ $name ]; } else { continue; } } $taxonomy = wc_attribute_taxonomy_name( str_replace( 'attribute_pa_', '', urldecode( $name ) ) ); // If this is a term slug, get the term's nice name. if ( taxonomy_exists( $taxonomy ) ) { $term = get_term_by( 'slug', $value, $taxonomy ); // @codingStandardsIgnoreLine WordPress.VIP.RestrictedFunctions.get_term_by if ( ! is_wp_error( $term ) && $term && $term->name ) { $value = $term->name; } $label = wc_attribute_label( $taxonomy ); // If this is a custom option slug, get the options name. } else { $value = apply_filters( 'woocommerce_variation_option_name', $value ); $product_attributes = $product->get_attributes(); $_name = str_replace( 'attribute_', '', $name ); if ( isset( $product_attributes[ $_name ] ) ) { $label = wc_attribute_label( $_name, $product ); } else { $label = $name; } } if ( '' === $value || wc_is_attribute_in_product_name( $value, is_callable( array( $product, 'get_name' ) ) ? $product->get_name() : $product->get_title() ) ) { continue; } $item_data[] = array( 'key' => $label, 'value' => $value, ); } // End foreach(). } // End if(). // Filter item data to allow 3rd parties to add more to the array. $item_data = apply_filters( 'tinvwl_wishlist_get_item_data', $item_data, $product ); // Format item data ready to display. foreach ( $item_data as $key => $data ) { // Set hidden to true to not display meta on cart. if ( ! empty( $data['hidden'] ) ) { unset( $item_data[ $key ] ); continue; } $item_data[ $key ]['key'] = ! empty( $data['key'] ) ? $data['key'] : $data['name']; $item_data[ $key ]['display'] = ! empty( $data['display'] ) ? $data['display'] : $data['value']; } // Output flat or in list format. if ( 0 < count( $item_data ) ) { ob_start(); if ( $flat ) { foreach ( $item_data as $data ) { echo esc_html( $data['key'] ) . ': ' . wp_kses_post( $data['display'] ) . '
'; } } else { tinv_wishlist_template( 'ti-wishlist-item-data.php', array( 'item_data' => $item_data ) ); } return ob_get_clean(); } return ''; } } // End if(). if ( ! function_exists( 'tinv_wishlist_get' ) ) { /** * Return Wishlist by id or share key * * @param mixed $id Integer wishlist ID, or Share Key wishlist. * @param boolean $toend Switches to the extract the default or guest wishlist. * * @return array */ function tinv_wishlist_get( $id = '', $toend = true ) { $wl = new TInvWL_Wishlist(); $wishlist = null; if ( empty( $id ) ) { $id = get_query_var( 'tinvwlID', null ); } if ( ! empty( $id ) ) { if ( is_integer( $id ) ) { $wishlist = $wl->get_by_id( $id ); } if ( empty( $wishlist ) ) { $wishlist = $wl->get_by_share_key( $id ); } if ( is_array( $wishlist ) ) { $wishlist['is_owner'] = false; if ( is_user_logged_in() ) { $wishlist['is_owner'] = get_current_user_id() == $wishlist['author']; // WPCS: loose comparison ok. } else { $wishlist['is_owner'] = $wl->get_sharekey() === $wishlist['share_key']; // WPCS: loose comparison ok. } } } elseif ( is_user_logged_in() && $toend ) { $wishlist = $wl->add_user_default(); $wishlist['is_owner'] = true; } elseif ( $toend ) { $wishlist = $wl->get_by_sharekey_default(); if ( ! empty( $wishlist ) ) { $wishlist = array_shift( $wishlist ); $wishlist['is_owner'] = $wl->get_sharekey() === $wishlist['share_key']; } } return $wishlist; } } // End if(). if ( ! function_exists( 'tinv_url_wishlist_default' ) ) { /** * Return the default wishlist url * * @return string */ function tinv_url_wishlist_default() { if ( tinv_get_option( 'general', 'my_account_endpoint' ) ) { return esc_url( wc_get_endpoint_url( tinv_get_option( 'general', 'my_account_endpoint_slug' ), '', wc_get_page_permalink( 'myaccount' ) ) ); } $page = apply_filters( 'wpml_object_id', tinv_get_option( 'page', 'wishlist' ), 'page', true ); // @codingStandardsIgnoreLine WordPress.Variables.GlobalVariables.OverrideProhibited if ( empty( $page ) ) { return ''; } $link = get_permalink( $page ); return $link; } } if ( ! function_exists( 'tinv_url_wishlist_by_key' ) ) { /** * Return the wishlist url by share key * * @param string $share_key Share Key wishlist. * @param integer $paged Page. * * @return string */ function tinv_url_wishlist_by_key( $share_key, $paged = 1 ) { $paged = absint( $paged ); $paged = 1 < $paged ? $paged : 1; $link = tinv_url_wishlist_default(); if ( empty( $link ) ) { return $link; } if ( 1 < $paged ) { $link = add_query_arg( 'wl_paged', $paged, $link ); } if ( $share_key ) { if ( get_option( 'permalink_structure' ) ) { $suffix = ''; if ( preg_match( '/([^\?]+)\?*?(.*)/i', $link, $_link ) ) { $link = $_link[1]; $suffix = $_link[2]; } if ( ! preg_match( '/\/$/', $link ) ) { $link .= '/'; } $link .= $share_key . '/' . $suffix; } else { $link = add_query_arg( 'tinvwlID', $share_key, $link ); } } return $link; } } // End if(). if ( ! function_exists( 'tinv_url_wishlist' ) ) { /** * Return the wishlist url by id or share key * * @param mixed $id Integer wishlist ID, or Share Key wishlist. * @param integer $paged Page. * @param boolean $full Return full url or shroted url for logged in user. * * @return string */ function tinv_url_wishlist( $id = '', $paged = 1, $full = true ) { $share_key = $id; if ( ! ( is_string( $id ) && preg_match( '/^[A-Fa-f0-9]{6}$/', $id ) ) ) { $wishlist = tinv_wishlist_get( $id, false ); $share_key = isset( $wishlist['share_key'] ) ? $wishlist['share_key'] : ''; } return tinv_url_wishlist_by_key( $share_key, $paged ); } } if ( ! function_exists( 'tinv_wishlist_status' ) ) { /** * Check status free or premium plugin and disable free * * @param string $transient Plugin transient name. * * @return string * @global string $s * * @global string $status * @global string $page */ function tinv_wishlist_status( $transient ) { if ( TINVWL_LOAD_FREE === $transient ) { TInvWL_PluginExtend::deactivate_self( TINVWL_LOAD_FREE ); return 'plugins.php'; } if ( defined( 'TINVWL_LOAD_PREMIUM' ) && TINVWL_LOAD_PREMIUM === $transient ) { if ( is_plugin_active( TINVWL_LOAD_FREE ) ) { TInvWL_PluginExtend::deactivate_self( TINVWL_LOAD_FREE ); if ( ! function_exists( 'wp_create_nonce' ) ) { return 'plugins.php'; } global $status, $page, $s; $redirect = 'plugins.php?'; $redirect .= http_build_query( array( 'action' => 'activate', 'plugin' => $transient, 'plugin_status' => $status, 'paged' => $page, 's' => $s, ) ); $redirect = esc_url_raw( add_query_arg( '_wpnonce', wp_create_nonce( 'activate-plugin_' . $transient ), $redirect ) ); return $redirect; } } return false; } } // End if(). if ( ! function_exists( 'tinvwl_body_classes' ) ) { /** * Add custom class * * @param array $classes Current classes. * * @return array */ function tinvwl_body_classes( $classes ) { if ( tinv_get_option( 'style', 'customstyle' ) ) { $classes[] = 'tinvwl-theme-style'; } else { $classes[] = 'tinvwl-custom-style'; } return $classes; } add_filter( 'body_class', 'tinvwl_body_classes' ); } if ( ! function_exists( 'tinvwl_shortcode_addtowishlist' ) ) { /** * Shortcode Add To Wishlist * * @param array $atts Array parameter from shortcode. * * @return string */ function tinvwl_shortcode_addtowishlist( $atts = array() ) { $class = TInvWL_Public_AddToWishlist::instance(); return $class->shortcode( $atts ); } add_shortcode( 'ti_wishlists_addtowishlist', 'tinvwl_shortcode_addtowishlist' ); } if ( ! function_exists( 'tinvwl_shortcode_view' ) ) { /** * Shortcode view Wishlist * * @param array $atts Array parameter from shortcode. * * @return string */ function tinvwl_shortcode_view( $atts = array() ) { $class = TInvWL_Public_Wishlist_View::instance(); return $class->shortcode( $atts ); } add_shortcode( 'ti_wishlistsview', 'tinvwl_shortcode_view' ); } if ( ! function_exists( 'tinvwl_shortcode_products_counter' ) ) { /** * Shortcode view Wishlist * * @param array $atts Array parameter from shortcode. * * @return string */ function tinvwl_shortcode_products_counter( $atts = array() ) { $class = TInvWL_Public_WishlistCounter::instance(); return $class->shortcode( $atts ); } add_shortcode( 'ti_wishlist_products_counter', 'tinvwl_shortcode_products_counter' ); } if ( ! function_exists( 'tinvwl_view_addto_html' ) ) { /** * Show button Add to Wishlsit */ function tinvwl_view_addto_html() { $class = TInvWL_Public_AddToWishlist::instance(); $class->htmloutput(); } } if ( ! function_exists( 'tinvwl_view_addto_htmlout' ) ) { /** * Show button Add to Wishlsit, if product is not purchasable */ function tinvwl_view_addto_htmlout() { $class = TInvWL_Public_AddToWishlist::instance(); $class->htmloutput_out(); } } if ( ! function_exists( 'tinvwl_view_addto_htmlloop' ) ) { /** * Show button Add to Wishlsit, in loop */ function tinvwl_view_addto_htmlloop() { $class = TInvWL_Public_AddToWishlist::instance(); $class->htmloutput_loop(); } } if ( ! function_exists( 'tinvwl_clean_url' ) ) { /** * Clear esc_url to original * * @param string $good_protocol_url Cleared URL. * @param string $original_url Original URL. * * @return string */ function tinvwl_clean_url( $good_protocol_url, $original_url ) { return $original_url; } } if ( ! function_exists( 'tinvwl_add_to_cart_need_redirect' ) ) { /** * Check if the product is third-party, or has another link added to the cart then redirect to the product page. * * @param boolean $redirect Default value to redirect. * @param \WC_Product $_product Product data. * @param string $redirect_url Current url for redirect. * * @return boolean */ function tinvwl_add_to_cart_need_redirect( $redirect, $_product, $redirect_url ) { if ( $redirect ) { return true; } if ( 'external' === $_product->get_type() ) { return true; } $need_url_data = array_merge( array( 'variation_id' => $_product->is_type( 'variation' ) ? $_product->get_id() : 0, 'add-to-cart' => $_product->is_type( 'variation' ) ? $_product->get_parent_id() : $_product->get_id(), ), array_map( 'urlencode', array() ) ); $need_url_data = array_filter( $need_url_data ); $need_url = apply_filters( 'tinvwl_product_add_to_cart_redirect_slug_original', remove_query_arg( 'added-to-cart', ( version_compare( WC_VERSION, '3.8.0', '<' ) ? add_query_arg( $need_url_data ) : add_query_arg( $need_url_data, '' ) ) ), $_product ); $need_url_full = apply_filters( 'tinvwl_product_add_to_cart_redirect_url_original', remove_query_arg( 'added-to-cart', add_query_arg( $need_url_data, $_product->get_permalink() ) ), $_product ); global $product; // store global product data. $_product_tmp = $product; // override global product data. $product = $_product; add_filter( 'clean_url', 'tinvwl_clean_url', 10, 2 ); do_action( 'before_get_redirect_url' ); $_redirect_url = apply_filters( 'tinvwl_product_add_to_cart_redirect_url', $_product->add_to_cart_url(), $_product ); do_action( 'after_get_redirect_url' ); remove_filter( 'clean_url', 'tinvwl_clean_url', 10 ); // restore global product data. $product = $_product_tmp; if ( $_redirect_url !== $need_url && $_redirect_url !== $need_url_full ) { return true; } return $redirect; } add_filter( 'tinvwl_product_add_to_cart_need_redirect', 'tinvwl_add_to_cart_need_redirect', 10, 3 ); } // End if(). if ( ! function_exists( 'tinvwl_meta_validate_cart_add' ) ) { /** * Checks the ability to add a product * * @param boolean $redirect Default value to redirect. * @param \WC_Product $product Product data. * @param string $redirect_url Current url for redirect. * @param array $wl_product Wishlist Product. * * @return boolean */ function tinvwl_meta_validate_cart_add( $redirect, $product, $redirect_url, $wl_product ) { if ( $redirect && array_key_exists( 'meta', $wl_product ) && ! empty( $wl_product['meta'] ) ) { $wl_product = apply_filters( 'tinvwl_addproduct_tocart', $wl_product ); TInvWL_Public_Cart::prepare_post( $wl_product ); $product_id = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $wl_product['product_id'] ) ); $quantity = empty( $wl_product['quantity'] ) ? 1 : wc_stock_amount( $wl_product['quantity'] ); $variation_id = $wl_product['variation_id']; $variations = $product->is_type( 'variation' ) ? wc_get_product_variation_attributes( $product->get_id() ) : array(); $passed_validation = $product->is_purchasable() && ( $product->is_in_stock() || $product->backorders_allowed() ) && 'external' !== $product->get_type(); ob_start(); if ( function_exists( 'wc_clear_notices' ) ) { wc_clear_notices(); } $passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', $passed_validation, $product_id, $quantity, $variation_id, $variations ); if ( function_exists( 'wc_get_notices' ) ) { $wc_errors = wc_get_notices( 'error' ); } $wc_output = ob_get_clean(); if ( $passed_validation && empty( $wc_errors ) && empty( $wc_output ) ) { $redirect = false; } TInvWL_Public_Cart::unprepare_post( $wl_product ); } return $redirect; } add_filter( 'tinvwl_product_add_to_cart_need_redirect', 'tinvwl_meta_validate_cart_add', 90, 4 ); } // End if(). if ( ! function_exists( 'tinv_wishlist_print_meta' ) ) { /** * Print meta data for wishlist form * * @param array $meta Meta Array. * @param boolean $flat Return text or template. * * @return string */ function tinv_wishlist_print_meta( $meta = array(), $flat = false ) { if ( ! is_array( $meta ) ) { $meta = array(); } $product_id = $variation_id = 0; if ( array_key_exists( 'product_id', $meta ) ) { $product_id = $meta['product_id']; } if ( array_key_exists( 'variation_id', $meta ) ) { $variation_id = $meta['variation_id']; } foreach ( array( 'add-to-cart', 'product_id', 'variation_id', 'quantity', 'action', 'variation' ) as $field ) { if ( array_key_exists( $field, $meta ) ) { unset( $meta[ $field ] ); } } if ( array_key_exists( 'tinvwl-hidden-fields', $meta ) ) { $hiddenFields = json_decode( $meta['tinvwl-hidden-fields'], true ); if ( $hiddenFields !== null ) { foreach ( $hiddenFields as $hiddenKey ) { if ( isset( $meta[ $hiddenKey ] ) ) { unset( $meta[ $hiddenKey ] ); } } } unset( $meta['tinvwl-hidden-fields'] ); } $meta = array_filter( $meta ); if ( empty( $meta ) ) { return ''; } $item_data = array(); foreach ( $meta as $key => $value ) { if ( ! preg_match( '/^\_/', $key ) ) { $item_data[ $key ] = array( 'key' => $key, 'display' => $value, ); } } foreach ( array_keys( $item_data ) as $key ) { if ( strpos( $key, 'attribute_' ) === 0 ) { unset( $item_data[ $key ] ); } } $item_data = apply_filters( 'tinvwl_wishlist_item_meta_post', $item_data, $product_id, $variation_id ); foreach ( $item_data as $key => $data ) { if ( is_object( $data['display'] ) || is_array( $data['display'] ) ) { $item_data[ $key ]['display'] = json_encode( $data['display'] ); } } ob_start(); if ( $flat ) { foreach ( $item_data as $data ) { echo esc_html( $data['key'] ) . ': ' . wp_kses_post( $data['display'] ) . '
'; } } else { if ( $item_data ) { tinv_wishlist_template( 'ti-wishlist-item-data.php', array( 'item_data' => $item_data ) ); } } return apply_filters( 'tinvwl_wishlist_item_meta_wishlist', ob_get_clean() ); } } // End if(). if ( ! function_exists( 'tinv_wishlistmeta' ) ) { /** * Show new meta data * * @param string $meta Print meta. * @param array $wl_product Wishlist product. * @param \WC_Product $product Woocommerce product. * * @return string */ function tinv_wishlistmeta( $meta, $wl_product, $product ) { if ( array_key_exists( 'meta', $wl_product ) ) { $wlmeta = apply_filters( 'tinvwl_wishlist_item_meta_wishlist_output', tinv_wishlist_print_meta( $wl_product['meta'] ), $wl_product, $product ); $meta .= $wlmeta; } return $meta; } add_filter( 'tinvwl_wishlist_item_meta_data', 'tinv_wishlistmeta', 10, 3 ); } if ( ! function_exists( 'tinvwl_add_to_cart_item_meta_post' ) ) { /** * Save post data to cart item * * @param array $cart_item_data Array with cart item information. * @param string $cart_item_key Cart item key. * * @return array */ function tinvwl_add_to_cart_item_meta_post( $cart_item_data, $cart_item_key ) { $postdata = $_POST; // @codingStandardsIgnoreLine WordPress.VIP.SuperGlobalInputUsage.AccessDetected $postdata = apply_filters( 'tinvwl_product_prepare_meta', $postdata, $cart_item_data['product_id'], $cart_item_data['variation_id'] ); if ( array_key_exists( 'variation_id', $postdata ) && ! empty( $postdata['variation_id'] ) ) { foreach ( $postdata as $key => $field ) { if ( preg_match( '/^attribute\_/', $key ) ) { unset( $postdata[ $key ] ); } } } foreach ( array( 'add-to-cart', 'product_id', 'variation_id', 'quantity' ) as $field ) { if ( array_key_exists( $field, $postdata ) ) { unset( $postdata[ $field ] ); } } $postdata = array_filter( $postdata ); if ( empty( $postdata ) ) { return $cart_item_data; } ksort( $postdata ); $cart_item_data['tinvwl_formdata'] = $postdata; return $cart_item_data; } add_action( 'woocommerce_add_cart_item', 'tinvwl_add_to_cart_item_meta_post', 10, 2 ); } // End if(). if ( ! function_exists( 'tinvwl_set_utm' ) ) { /** * Set UTM sources. */ function tinvwl_set_utm() { // Set a source. define( 'TINVWL_UTM_SOURCE', 'wordpress_org' ); // Set a medium. define( 'TINVWL_UTM_MEDIUM', 'organic' ); // Set a campaign. define( 'TINVWL_UTM_CAMPAIGN', 'organic' ); } } // End if(). if ( ! function_exists( 'is_wishlist' ) ) { /** * is_wishlist - Returns true when viewing the wishlist page. * * @return bool */ function is_wishlist() { return ( is_page( apply_filters( 'wpml_object_id', tinv_get_option( 'page', 'wishlist' ), 'page', true ) ) ); } } if ( ! function_exists( 'tinvwl_get_wishlist_products' ) ) { /** * Get wishlist products for default user wishlist or by ID or SHAREKEY * * @param int $wishlist_id by ID or SHAREKEY, 0 = default wishlist of current user * @param array $data query parameters for get() method of TInvWL_Product() class. * * @return array|bool */ function tinvwl_get_wishlist_products( $wishlist_id = 0, $data = array() ) { $wishlist = tinv_wishlist_get( $wishlist_id ); if ( empty( $wishlist ) ) { return false; } $wlp = new TInvWL_Product( $wishlist ); $products = $wlp->get_wishlist( $data ); if ( empty( $products ) ) { return false; } return $products; } } if ( ! function_exists( 'wp_recursive_ksort' ) ) { /** * Sorts the keys of an array alphabetically. * The array is passed by reference so it doesn't get returned * which mimics the behaviour of ksort. * * @param array $array The array to sort, passed by reference. * * @since 2.3.1 * */ function wp_recursive_ksort( &$array ) { foreach ( $array as &$value ) { if ( is_array( $value ) ) { wp_recursive_ksort( $value ); } } ksort( $array ); } } if ( ! function_exists( 'wc_is_attribute_in_product_name' ) ) { /** * Check if an attribute is included in the attributes area of a variation name. * * @param string $attribute Attribute value to check for. * @param string $name Product name to check in. * * @return bool * @since 2.3.1 */ function wc_is_attribute_in_product_name( $attribute, $name ) { $is_in_name = stristr( $name, ' ' . $attribute . ',' ) || 0 === stripos( strrev( $name ), strrev( ' ' . $attribute ) ); return apply_filters( 'woocommerce_is_attribute_in_product_name', $is_in_name, $attribute, $name ); } } add_action( 'admin_init', 'tinvwl_handle_external_redirects', 9 ); function tinvwl_handle_external_redirects() { if ( empty( $_GET['page'] ) ) { return; } if ( 'tinvwl-upgrade' === $_GET['page'] ) { wp_redirect( 'https://templateinvaders.com/product/ti-woocommerce-wishlist-wordpress-plugin/?utm_source=' . TINVWL_UTM_SOURCE . '&utm_campaign=' . TINVWL_UTM_CAMPAIGN . '&utm_medium=' . TINVWL_UTM_MEDIUM . '&utm_content=wp_menu&partner=' . TINVWL_UTM_SOURCE ); die; } } add_action( 'init', function () { if ( ! is_user_logged_in() ) { add_filter( 'nonce_user_logged_out', function ( $uid, $action = - 1 ) { if ( $action === 'wp_rest' ) { return get_current_user_id(); } return $uid; }, 99, 2 ); } } ); /** * Get message placeholders for the add-to-wishlist message. * * @param string $string The message string to replace placeholders. * @param WC_Product|null $product (Optional) The product to get the message placeholders for. * @param array|null $wishlist (Optional) The wishlist to get the message placeholders for. * * @return string The message string with replaced placeholders. */ function tinvwl_message_placeholders( string $string, ?WC_Product $product = null, ?array $wishlist = null ): string { $placeholders = []; if ( $product instanceof WC_Product ) { $placeholders['{product_name}'] = is_callable( [ $product, 'get_name' ] ) ? $product->get_name() : $product->get_title(); $placeholders['{product_sku}'] = $product->get_sku(); } if ( is_array( $wishlist ) ) { $wishlist_title = empty( $wishlist['title'] ) ? apply_filters( 'tinvwl_default_wishlist_title', tinv_get_option( 'general', 'default_title' ) ) : $wishlist['title']; $placeholders['{wishlist_title}'] = $wishlist_title; } /** * Filters the message placeholders for the add-to-wishlist message. * * @param array $placeholders The message placeholders. * @param WC_Product|null $product The product to get the message placeholders for. * @param array|null $wishlist The wishlist to get the message placeholders for. */ $placeholders = apply_filters( 'tinvwl_addtowishlist_message_placeholders', $placeholders, $product, $wishlist ); $find = array_keys( $placeholders ); $replace = array_values( $placeholders ); return str_replace( $find, $replace, $string ); } // Declare scheduled hooks add_action( 'tinvwl_flush_rewrite_rules', 'TInvWL_Public_TInvWL::apply_rewrite_rules' ); add_action( 'tinvwl_disable_notifications_event', 'TInvWL_Admin_Notices::disable_notifications' ); add_action( 'tinvwl_remove_without_author_wishlist', 'TInvWL_Admin_TInvWL::remove_old_wishlists' );