• File: utilities.php
  • Full Path: /home/matthif/www/wp-content/plugins/wpforms-lite/includes/functions/utilities.php
  • Date Modified: 02/16/2024 11:45 AM
  • File size: 7.4 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
/**
 * Generic helper functions.
 *
 * @since 1.8.0
 */

use WPForms\Helpers\Chain;

/**
 * Get a suffix for assets, `.min` if debug is disabled.
 *
 * @since 1.4.1
 *
 * @return string
 */
function wpforms_get_min_suffix() {

    return 
wpforms_debug() ? '' '.min';
}

/**
 * Chain monad, useful for chaining certain array or string related functions.
 *
 * @since 1.5.6
 *
 * @param mixed $value Any data.
 *
 * @return Chain
 */
function wpforms_chain$value ) {

    return 
Chain::of$value );
}

/**
 * Convert object to an array.
 *
 * @since 1.1.7
 *
 * @param object $object Object to convert.
 *
 * @return mixed
 */
function wpforms_object_to_array$object ) {

    if ( ! 
is_object$object ) && ! is_array$object ) ) {
        return 
$object;
    }

    if ( 
is_object$object ) ) {
        
$object get_object_vars$object );
    }

    return 
array_map'wpforms_object_to_array'$object );
}

/**
 * Insert an array into another array before/after a certain key.
 *
 * @link  https://gist.github.com/scribu/588429
 *
 * @since 1.3.9
 *
 * @param array  $array    The initial array.
 * @param array  $pairs    The array to insert.
 * @param string $key      The certain key.
 * @param string $position Where to insert the array - before or after the key.
 *
 * @return array
 */
function wpforms_array_insert$array$pairs$key$position 'after' ) {

    
$key_pos array_search$keyarray_keys$array ), true );

    if ( 
$position === 'after' ) {
        
$key_pos ++;
    }

    if ( 
$key_pos !== false ) {
        
$result array_slice$array0$key_pos );
        
$result array_merge$result$pairs );
        
$result array_merge$resultarray_slice$array$key_pos ) );
    } else {
        
$result array_merge$array$pairs );
    }

    return 
$result;
}

/**
 * Recursively remove empty strings from an array.
 *
 * @since 1.3.9.1
 *
 * @param array $data Any data.
 *
 * @return array
 */
function wpforms_array_remove_empty_strings$data ) {

    foreach ( 
$data as $key => $value ) {
        if ( 
is_array$value ) ) {
            
$data$key ] = wpforms_array_remove_empty_strings$data$key ] );
        }

        if ( 
$data$key ] === '' ) {
            unset( 
$data$key ] );
        }
    }

    return 
$data;
}

/**
 * Count words in the string.
 *
 * @since 1.6.2
 *
 * @param string $string String value.
 *
 * @return integer Words count.
 */
function wpforms_count_words$string ) {

    if ( ! 
is_string$string ) ) {
        return 
0;
    }

    
$patterns = [
        
'/([A-Z]+),([A-Z]+)/i',
        
'/([0-9]+),([A-Z]+)/i',
        
'/([A-Z]+),([0-9]+)/i',
    ];

    foreach ( 
$patterns as $pattern ) {
        
$string preg_replace_callback(
            
$pattern,
            function( 
$matches ) {
                return 
$matches[1] . ', ' $matches[2];
            },
            
$string
        
);
    }

    
$words preg_split'/[\s]+/'$string );

    return 
is_array$words ) ? count$words ) : 0;
}

/**
 * Link a list of words or phrases with commas, but the last one – with a conjunction.
 *
 * For example:
 * [ 'Sullie', 'Pattie', 'me' ] with 'and' conjunction becomes 'Sullie, Pattie and me'.
 * [ 'Sullie', 'Pattie', 'me' ] with 'or' conjunction becomes 'Sullie, Pattie or me'.
 *
 * @since 1.8.0
 *
 * @param array  $list        A list of words or phrases to link together.
 * @param string $conjunction Coordinating conjunction to use for last word or phrase (usually – and, or).
 *                            The string is expected to be translatable.
 *
 * @return string Linked words and/or phrases.
 */
function wpforms_conjunct$list$conjunction ) {

    
$last_chunk array_pop$list );

    return 
$list ?
        
sprintf'%s %s %s'implode', '$list ), $conjunction$last_chunk ) :
        
$last_chunk;
}

/**
 * Get the current URL.
 *
 * @since 1.0.0
 * @since 1.7.2 Refactored based on the `home_url` function.
 *
 * @return string
 */
function wpforms_current_url() {

    
$parsed_home_url wp_parse_urlhome_url() );

    
$url $parsed_home_url['scheme'] . '://' $parsed_home_url['host'];

    if ( ! empty( 
$parsed_home_url['port'] ) ) {
        
$url .= ':' $parsed_home_url['port'];
    }

    
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotValidated, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
    
$url .= wp_unslash$_SERVER['REQUEST_URI'] );

    return 
esc_url_raw$url );
}

/**
 * Add UTM tags to a link that allows detecting traffic sources for our or partners' websites.
 *
 * @since 1.7.5
 *
 * @param string $link    Link to which you need to add UTM tags.
 * @param string $medium  The page or location description. Check your current page and try to find
 *                        and use an already existing medium for links otherwise, use a page name.
 * @param string $content The feature's name, the button's content, the link's text, or something
 *                        else that describes the element that contains the link.
 * @param string $term    Additional information for the content that makes the link more unique.
 *
 * @return string
 */
function wpforms_utm_link$link$medium$content ''$term '' ) {

    return 
add_query_arg(
        
array_filter(
            [
                
'utm_campaign' => wpforms()->is_pro() ? 'plugin' 'liteplugin',
                
'utm_source'   => strpos$link'https://wpforms.com' ) === 'WordPress' 'wpformsplugin',
                
'utm_medium'   => rawurlencode$medium ),
                
'utm_content'  => rawurlencode$content ),
                
'utm_term'     => rawurlencode$term ),
                
'utm_locale'   => wpforms_sanitize_keyget_locale() ),
            ]
        ),
        
$link
    
);
}

/**
 * Modify the default USer-Agent generated by wp_remote_*() to include additional information.
 *
 * @since 1.7.5.2
 *
 * @return string
 */
function wpforms_get_default_user_agent() {

    
$license_type wpforms()->is_pro() ? ucwords( (string) wpforms_get_license_type() ) : 'Lite';

    return 
'WordPress/' get_bloginfo'version' ) . '; ' get_bloginfo'url' ) . '; WPForms/' $license_type '-' WPFORMS_VERSION;
}

/**
 * Get the ISO 639-2 Language Code from user/site locale.
 *
 * @see http://www.loc.gov/standards/iso639-2/php/code_list.php
 *
 * @since 1.5.0
 *
 * @return string
 */
function wpforms_get_language_code() {

    
$default_lang 'en';
    
$locale       get_user_locale();

    if ( ! empty( 
$locale ) ) {
        
$lang explode'_'$locale );

        if ( ! empty( 
$lang ) && is_array$lang ) ) {
            
$default_lang strtolower$lang[0] );
        }
    }

    return 
$default_lang;
}

/**
 * Changes array of items into string of items, separated by comma and sql-escaped.
 *
 * @see https://coderwall.com/p/zepnaw
 *
 * @since 1.7.4
 *
 * @param mixed|array $items  Item(s) to be joined into string.
 * @param string      $format Can be %s or %d.
 *
 * @return string Items separated by comma and sql-escaped.
 */
function wpforms_wpdb_prepare_in$items$format '%s' ) {

    global 
$wpdb;

    
$items    = (array) $items;
    
$how_many count$items );

    if ( 
$how_many === ) {
        return 
'';
    }

    
$placeholders    array_fill0$how_many$format );
    
$prepared_format implode','$placeholders );

    
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
    
return $wpdb->prepare$prepared_format$items );
}

/**
 * Get the render engine slug according to the Modern Markup setting value and corresponding filter.
 *
 * @since 1.8.1
 *
 * @return string
 */
function wpforms_get_render_engine() {

    
$render_engine = empty( wpforms_setting'modern-markup'false ) ) ? 'classic' 'modern';

    
/**
     * Filter current render engine slug.
     * Allows addons to use their own frontend rendering engine.
     *
     * @since 1.8.1
     *
     * @param string $render_engine Render engine slug.
     */
    
$render_engine apply_filters'wpforms_get_render_engine'$render_engine );

    return 
$render_engine;
}