2019-02-10 20:21:07 +01:00
< ? php
/**
* Helper methods
*
* @ package Kirki
* @ category Core
2019-02-17 14:28:35 +01:00
* @ author Ari Stathopoulos ( @ aristath )
* @ copyright Copyright ( c ) 2019 , Ari Stathopoulos ( @ aristath )
2020-02-25 18:04:54 +01:00
* @ license https :// opensource . org / licenses / MIT
2019-02-10 20:21:07 +01:00
* @ since 1.0
*/
// Exit if accessed directly.
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
/**
* A simple object containing static methods .
*/
class Kirki_Helper {
/**
* Recursive replace in arrays .
*
* @ static
* @ access public
* @ param array $array The first array .
* @ param array $array1 The second array .
* @ return mixed
*/
public static function array_replace_recursive ( $array , $array1 ) {
if ( function_exists ( 'array_replace_recursive' ) ) {
return array_replace_recursive ( $array , $array1 );
}
2019-02-17 14:28:35 +01:00
/**
* Handle the arguments , merge one by one .
*
* In PHP 7 func_get_args () changed the way it behaves but this doesn ' t mean anything in this case
* sinc ethis method is only used when the array_replace_recursive () function doesn ' t exist
* and that was introduced in PHP v5 . 3.
*
* Once WordPress - Core raises its minimum requirements we '' ' be able to remove this fallback completely .
*/
$args = func_get_args (); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue
2019-02-10 20:21:07 +01:00
$array = $args [ 0 ];
if ( ! is_array ( $array ) ) {
return $array ;
}
$count = count ( $args );
for ( $i = 1 ; $i < $count ; $i ++ ) {
if ( is_array ( $args [ $i ] ) ) {
$array = self :: recurse ( $array , $args [ $i ] );
}
}
return $array ;
}
/**
* Helper method to be used from the array_replace_recursive method .
*
* @ static
* @ access public
* @ param array $array The first array .
* @ param array $array1 The second array .
* @ return array
*/
public static function recurse ( $array , $array1 ) {
foreach ( $array1 as $key => $value ) {
// Create new key in $array, if it is empty or not an array.
if ( ! isset ( $array [ $key ] ) || ( isset ( $array [ $key ] ) && ! is_array ( $array [ $key ] ) ) ) {
$array [ $key ] = array ();
}
// Overwrite the value in the base array.
if ( is_array ( $value ) ) {
$value = self :: recurse ( $array [ $key ], $value );
}
$array [ $key ] = $value ;
}
return $array ;
}
/**
* Initialize the WP_Filesystem
*
* @ static
* @ access public
* @ return object WP_Filesystem
*/
public static function init_filesystem () {
$credentials = array ();
if ( ! defined ( 'FS_METHOD' ) ) {
define ( 'FS_METHOD' , 'direct' );
}
$method = defined ( 'FS_METHOD' ) ? FS_METHOD : false ;
if ( 'ftpext' === $method ) {
// If defined, set it to that, Else, set to NULL.
$credentials [ 'hostname' ] = defined ( 'FTP_HOST' ) ? preg_replace ( '|\w+://|' , '' , FTP_HOST ) : null ;
$credentials [ 'username' ] = defined ( 'FTP_USER' ) ? FTP_USER : null ;
$credentials [ 'password' ] = defined ( 'FTP_PASS' ) ? FTP_PASS : null ;
// Set FTP port.
if ( strpos ( $credentials [ 'hostname' ], ':' ) && null !== $credentials [ 'hostname' ] ) {
list ( $credentials [ 'hostname' ], $credentials [ 'port' ] ) = explode ( ':' , $credentials [ 'hostname' ], 2 );
if ( ! is_numeric ( $credentials [ 'port' ] ) ) {
unset ( $credentials [ 'port' ] );
}
} else {
unset ( $credentials [ 'port' ] );
}
// Set connection type.
if ( ( defined ( 'FTP_SSL' ) && FTP_SSL ) && 'ftpext' === $method ) {
$credentials [ 'connection_type' ] = 'ftps' ;
} elseif ( ! array_filter ( $credentials ) ) {
$credentials [ 'connection_type' ] = null ;
} else {
$credentials [ 'connection_type' ] = 'ftp' ;
}
}
// The WordPress filesystem.
global $wp_filesystem ;
if ( empty ( $wp_filesystem ) ) {
2019-02-17 14:28:35 +01:00
require_once wp_normalize_path ( ABSPATH . '/wp-admin/includes/file.php' ); // phpcs:ignore WPThemeReview.CoreFunctionality.FileInclude
2019-02-10 20:21:07 +01:00
WP_Filesystem ( $credentials );
}
return $wp_filesystem ;
}
/**
* Returns the attachment object
*
* @ static
* @ access public
* @ see https :// pippinsplugins . com / retrieve - attachment - id - from - image - url /
* @ param string $url URL to the image .
* @ return int | string Numeric ID of the attachement .
*/
public static function get_image_id ( $url ) {
global $wpdb ;
if ( empty ( $url ) ) {
return 0 ;
}
$attachment = wp_cache_get ( 'kirki_image_id_' . md5 ( $url ), null );
if ( false === $attachment ) {
$attachment = $wpdb -> get_col ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE guid = %s; " , $url ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
wp_cache_add ( 'kirki_image_id_' . md5 ( $url ), $attachment , null );
}
if ( ! empty ( $attachment ) ) {
return $attachment [ 0 ];
}
return 0 ;
}
/**
* Returns an array of the attachment ' s properties .
*
* @ param string $url URL to the image .
* @ return array
*/
public static function get_image_from_url ( $url ) {
$image_id = self :: get_image_id ( $url );
$image = wp_get_attachment_image_src ( $image_id , 'full' );
return array (
'url' => $image [ 0 ],
'width' => $image [ 1 ],
'height' => $image [ 2 ],
'thumbnail' => $image [ 3 ],
);
}
/**
* Get an array of posts .
*
* @ static
* @ access public
* @ param array $args Define arguments for the get_posts function .
* @ return array
*/
public static function get_posts ( $args ) {
if ( is_string ( $args ) ) {
$args = add_query_arg (
array (
'suppress_filters' => false ,
)
);
} elseif ( is_array ( $args ) && ! isset ( $args [ 'suppress_filters' ] ) ) {
$args [ 'suppress_filters' ] = false ;
}
// Get the posts.
// TODO: WordPress.VIP.RestrictedFunctions.get_posts_get_posts.
$posts = get_posts ( $args );
// Properly format the array.
$items = array ();
foreach ( $posts as $post ) {
$items [ $post -> ID ] = $post -> post_title ;
}
wp_reset_postdata ();
return $items ;
}
/**
* Get an array of publicly - querable taxonomies .
*
* @ static
* @ access public
* @ return array
*/
public static function get_taxonomies () {
$items = array ();
// Get the taxonomies.
$taxonomies = get_taxonomies (
array (
'public' => true ,
)
);
// Build the array.
foreach ( $taxonomies as $taxonomy ) {
$id = $taxonomy ;
$taxonomy = get_taxonomy ( $taxonomy );
$items [ $id ] = $taxonomy -> labels -> name ;
}
return $items ;
}
/**
* Get an array of publicly - querable post - types .
*
* @ static
* @ access public
* @ return array
*/
public static function get_post_types () {
$items = array ();
// Get the post types.
$post_types = get_post_types (
array (
'public' => true ,
2019-02-17 14:28:35 +01:00
),
'objects'
2019-02-10 20:21:07 +01:00
);
// Build the array.
foreach ( $post_types as $post_type ) {
$items [ $post_type -> name ] = $post_type -> labels -> name ;
}
return $items ;
}
/**
* Get an array of terms from a taxonomy
*
* @ static
* @ access public
* @ param string | array $taxonomies See https :// developer . wordpress . org / reference / functions / get_terms / for details .
* @ return array
*/
public static function get_terms ( $taxonomies ) {
$items = array ();
// Get the post types.
$terms = get_terms ( $taxonomies );
// Build the array.
foreach ( $terms as $term ) {
$items [ $term -> term_id ] = $term -> name ;
}
return $items ;
}
/**
* Gets an array of material - design colors .
*
* @ static
* @ access public
* @ param string $context Allows us to get subsets of the palette .
* @ return array
*/
public static function get_material_design_colors ( $context = 'primary' ) {
$colors = array (
'primary' => array ( '#FFFFFF' , '#000000' , '#F44336' , '#E91E63' , '#9C27B0' , '#673AB7' , '#3F51B5' , '#2196F3' , '#03A9F4' , '#00BCD4' , '#009688' , '#4CAF50' , '#8BC34A' , '#CDDC39' , '#FFEB3B' , '#FFC107' , '#FF9800' , '#FF5722' , '#795548' , '#9E9E9E' , '#607D8B' ),
'red' => array ( '#FFEBEE' , '#FFCDD2' , '#EF9A9A' , '#E57373' , '#EF5350' , '#F44336' , '#E53935' , '#D32F2F' , '#C62828' , '#B71C1C' , '#FF8A80' , '#FF5252' , '#FF1744' , '#D50000' ),
'pink' => array ( '#FCE4EC' , '#F8BBD0' , '#F48FB1' , '#F06292' , '#EC407A' , '#E91E63' , '#D81B60' , '#C2185B' , '#AD1457' , '#880E4F' , '#FF80AB' , '#FF4081' , '#F50057' , '#C51162' ),
'purple' => array ( '#F3E5F5' , '#E1BEE7' , '#CE93D8' , '#BA68C8' , '#AB47BC' , '#9C27B0' , '#8E24AA' , '#7B1FA2' , '#6A1B9A' , '#4A148C' , '#EA80FC' , '#E040FB' , '#D500F9' , '#AA00FF' ),
'deep-purple' => array ( '#EDE7F6' , '#D1C4E9' , '#B39DDB' , '#9575CD' , '#7E57C2' , '#673AB7' , '#5E35B1' , '#512DA8' , '#4527A0' , '#311B92' , '#B388FF' , '#7C4DFF' , '#651FFF' , '#6200EA' ),
'indigo' => array ( '#E8EAF6' , '#C5CAE9' , '#9FA8DA' , '#7986CB' , '#5C6BC0' , '#3F51B5' , '#3949AB' , '#303F9F' , '#283593' , '#1A237E' , '#8C9EFF' , '#536DFE' , '#3D5AFE' , '#304FFE' ),
'blue' => array ( '#E3F2FD' , '#BBDEFB' , '#90CAF9' , '#64B5F6' , '#42A5F5' , '#2196F3' , '#1E88E5' , '#1976D2' , '#1565C0' , '#0D47A1' , '#82B1FF' , '#448AFF' , '#2979FF' , '#2962FF' ),
'light-blue' => array ( '#E1F5FE' , '#B3E5FC' , '#81D4fA' , '#4fC3F7' , '#29B6FC' , '#03A9F4' , '#039BE5' , '#0288D1' , '#0277BD' , '#01579B' , '#80D8FF' , '#40C4FF' , '#00B0FF' , '#0091EA' ),
'cyan' => array ( '#E0F7FA' , '#B2EBF2' , '#80DEEA' , '#4DD0E1' , '#26C6DA' , '#00BCD4' , '#00ACC1' , '#0097A7' , '#00838F' , '#006064' , '#84FFFF' , '#18FFFF' , '#00E5FF' , '#00B8D4' ),
'teal' => array ( '#E0F2F1' , '#B2DFDB' , '#80CBC4' , '#4DB6AC' , '#26A69A' , '#009688' , '#00897B' , '#00796B' , '#00695C' , '#004D40' , '#A7FFEB' , '#64FFDA' , '#1DE9B6' , '#00BFA5' ),
'green' => array ( '#E8F5E9' , '#C8E6C9' , '#A5D6A7' , '#81C784' , '#66BB6A' , '#4CAF50' , '#43A047' , '#388E3C' , '#2E7D32' , '#1B5E20' , '#B9F6CA' , '#69F0AE' , '#00E676' , '#00C853' ),
'light-green' => array ( '#F1F8E9' , '#DCEDC8' , '#C5E1A5' , '#AED581' , '#9CCC65' , '#8BC34A' , '#7CB342' , '#689F38' , '#558B2F' , '#33691E' , '#CCFF90' , '#B2FF59' , '#76FF03' , '#64DD17' ),
'lime' => array ( '#F9FBE7' , '#F0F4C3' , '#E6EE9C' , '#DCE775' , '#D4E157' , '#CDDC39' , '#C0CA33' , '#A4B42B' , '#9E9D24' , '#827717' , '#F4FF81' , '#EEFF41' , '#C6FF00' , '#AEEA00' ),
'yellow' => array ( '#FFFDE7' , '#FFF9C4' , '#FFF590' , '#FFF176' , '#FFEE58' , '#FFEB3B' , '#FDD835' , '#FBC02D' , '#F9A825' , '#F57F17' , '#FFFF82' , '#FFFF00' , '#FFEA00' , '#FFD600' ),
'amber' => array ( '#FFF8E1' , '#FFECB3' , '#FFE082' , '#FFD54F' , '#FFCA28' , '#FFC107' , '#FFB300' , '#FFA000' , '#FF8F00' , '#FF6F00' , '#FFE57F' , '#FFD740' , '#FFC400' , '#FFAB00' ),
'orange' => array ( '#FFF3E0' , '#FFE0B2' , '#FFCC80' , '#FFB74D' , '#FFA726' , '#FF9800' , '#FB8C00' , '#F57C00' , '#EF6C00' , '#E65100' , '#FFD180' , '#FFAB40' , '#FF9100' , '#FF6D00' ),
'deep-orange' => array ( '#FBE9A7' , '#FFCCBC' , '#FFAB91' , '#FF8A65' , '#FF7043' , '#FF5722' , '#F4511E' , '#E64A19' , '#D84315' , '#BF360C' , '#FF9E80' , '#FF6E40' , '#FF3D00' , '#DD2600' ),
'brown' => array ( '#EFEBE9' , '#D7CCC8' , '#BCAAA4' , '#A1887F' , '#8D6E63' , '#795548' , '#6D4C41' , '#5D4037' , '#4E342E' , '#3E2723' ),
'grey' => array ( '#FAFAFA' , '#F5F5F5' , '#EEEEEE' , '#E0E0E0' , '#BDBDBD' , '#9E9E9E' , '#757575' , '#616161' , '#424242' , '#212121' , '#000000' , '#ffffff' ),
'blue-grey' => array ( '#ECEFF1' , '#CFD8DC' , '#B0BBC5' , '#90A4AE' , '#78909C' , '#607D8B' , '#546E7A' , '#455A64' , '#37474F' , '#263238' ),
);
switch ( $context ) {
case '50' :
case '100' :
case '200' :
case '300' :
case '400' :
case '500' :
case '600' :
case '700' :
case '800' :
case '900' :
case 'A100' :
case 'A200' :
case 'A400' :
case 'A700' :
$key = absint ( $context ) / 100 ;
if ( 'A100' === $context ) {
$key = 10 ;
unset ( $colors [ 'grey' ] );
} elseif ( 'A200' === $context ) {
$key = 11 ;
unset ( $colors [ 'grey' ] );
} elseif ( 'A400' === $context ) {
$key = 12 ;
unset ( $colors [ 'grey' ] );
} elseif ( 'A700' === $context ) {
$key = 13 ;
unset ( $colors [ 'grey' ] );
}
unset ( $colors [ 'primary' ] );
$position_colors = array ();
foreach ( $colors as $color_family ) {
if ( isset ( $color_family [ $key ] ) ) {
$position_colors [] = $color_family [ $key ];
}
}
return $position_colors ;
case 'all' :
unset ( $colors [ 'primary' ] );
$all_colors = array ();
foreach ( $colors as $color_family ) {
foreach ( $color_family as $color ) {
$all_colors [] = $color ;
}
}
return $all_colors ;
case 'primary' :
return $colors [ 'primary' ];
default :
if ( isset ( $colors [ $context ] ) ) {
return $colors [ $context ];
}
return $colors [ 'primary' ];
}
}
/**
* Get an array of all available dashicons .
*
* @ static
* @ access public
* @ return array
*/
public static function get_dashicons () {
return array (
'admin-menu' => array ( 'menu' , 'admin-site' , 'dashboard' , 'admin-post' , 'admin-media' , 'admin-links' , 'admin-page' , 'admin-comments' , 'admin-appearance' , 'admin-plugins' , 'admin-users' , 'admin-tools' , 'admin-settings' , 'admin-network' , 'admin-home' , 'admin-generic' , 'admin-collapse' , 'filter' , 'admin-customizer' , 'admin-multisite' ),
'welcome-screen' => array ( 'welcome-write-blog' , 'welcome-add-page' , 'welcome-view-site' , 'welcome-widgets-menus' , 'welcome-comments' , 'welcome-learn-more' ),
'post-formats' => array ( 'format-aside' , 'format-image' , 'format-gallery' , 'format-video' , 'format-status' , 'format-quote' , 'format-chat' , 'format-audio' , 'camera' , 'images-alt' , 'images-alt2' , 'video-alt' , 'video-alt2' , 'video-alt3' ),
'media' => array ( 'media-archive' , 'media-audio' , 'media-code' , 'media-default' , 'media-document' , 'media-interactive' , 'media-spreadsheet' , 'media-text' , 'media-video' , 'playlist-audio' , 'playlist-video' , 'controls-play' , 'controls-pause' , 'controls-forward' , 'controls-skipforward' , 'controls-back' , 'controls-skipback' , 'controls-repeat' , 'controls-volumeon' , 'controls-volumeoff' ),
'image-editing' => array ( 'image-crop' , 'image-rotate' , 'image-rotate-left' , 'image-rotate-right' , 'image-flip-vertical' , 'image-flip-horizontal' , 'image-filter' , 'undo' , 'redo' ),
'tinymce' => array ( 'editor-bold' , 'editor-italic' , 'editor-ul' , 'editor-ol' , 'editor-quote' , 'editor-alignleft' , 'editor-aligncenter' , 'editor-alignright' , 'editor-insertmore' , 'editor-spellcheck' , 'editor-expand' , 'editor-contract' , 'editor-kitchensink' , 'editor-underline' , 'editor-justify' , 'editor-textcolor' , 'editor-paste-word' , 'editor-paste-text' , 'editor-removeformatting' , 'editor-video' , 'editor-customchar' , 'editor-outdent' , 'editor-indent' , 'editor-help' , 'editor-strikethrough' , 'editor-unlink' , 'editor-rtl' , 'editor-break' , 'editor-code' , 'editor-paragraph' , 'editor-table' ),
'posts' => array ( 'align-left' , 'align-right' , 'align-center' , 'align-none' , 'lock' , 'unlock' , 'calendar' , 'calendar-alt' , 'visibility' , 'hidden' , 'post-status' , 'edit' , 'trash' , 'sticky' ),
'sorting' => array ( 'external' , 'arrow-up' , 'arrow-down' , 'arrow-right' , 'arrow-left' , 'arrow-up-alt' , 'arrow-down-alt' , 'arrow-right-alt' , 'arrow-left-alt' , 'arrow-up-alt2' , 'arrow-down-alt2' , 'arrow-right-alt2' , 'arrow-left-alt2' , 'sort' , 'leftright' , 'randomize' , 'list-view' , 'exerpt-view' , 'grid-view' ),
'social' => array ( 'share' , 'share-alt' , 'share-alt2' , 'twitter' , 'rss' , 'email' , 'email-alt' , 'facebook' , 'facebook-alt' , 'googleplus' , 'networking' ),
'wordpress_org' => array ( 'hammer' , 'art' , 'migrate' , 'performance' , 'universal-access' , 'universal-access-alt' , 'tickets' , 'nametag' , 'clipboard' , 'heart' , 'megaphone' , 'schedule' ),
'products' => array ( 'wordpress' , 'wordpress-alt' , 'pressthis' , 'update' , 'screenoptions' , 'info' , 'cart' , 'feedback' , 'cloud' , 'translation' ),
'taxonomies' => array ( 'tag' , 'category' ),
'widgets' => array ( 'archive' , 'tagcloud' , 'text' ),
'notifications' => array ( 'yes' , 'no' , 'no-alt' , 'plus' , 'plus-alt' , 'minus' , 'dismiss' , 'marker' , 'star-filled' , 'star-half' , 'star-empty' , 'flag' , 'warning' ),
'misc' => array ( 'location' , 'location-alt' , 'vault' , 'shield' , 'shield-alt' , 'sos' , 'search' , 'slides' , 'analytics' , 'chart-pie' , 'chart-bar' , 'chart-line' , 'chart-area' , 'groups' , 'businessman' , 'id' , 'id-alt' , 'products' , 'awards' , 'forms' , 'testimonial' , 'portfolio' , 'book' , 'book-alt' , 'download' , 'upload' , 'backup' , 'clock' , 'lightbulb' , 'microphone' , 'desktop' , 'tablet' , 'smartphone' , 'phone' , 'index-card' , 'carrot' , 'building' , 'store' , 'album' , 'palmtree' , 'tickets-alt' , 'money' , 'smiley' , 'thumbs-up' , 'thumbs-down' , 'layout' ),
);
}
/**
* Compares the 2 values given the condition
*
* @ param mixed $value1 The 1 st value in the comparison .
* @ param mixed $value2 The 2 nd value in the comparison .
* @ param string $operator The operator we ' ll use for the comparison .
* @ return boolean whether The comparison has succeded ( true ) or failed ( false ) .
*/
public static function compare_values ( $value1 , $value2 , $operator ) {
if ( '===' === $operator ) {
return $value1 === $value2 ;
}
if ( '!==' === $operator ) {
return $value1 !== $value2 ;
}
if ( ( '!=' === $operator || 'not equal' === $operator ) ) {
2019-02-17 14:28:35 +01:00
return $value1 != $value2 ; // phpcs:ignore WordPress.PHP.StrictComparisons
2019-02-10 20:21:07 +01:00
}
if ( ( '>=' === $operator || 'greater or equal' === $operator || 'equal or greater' === $operator ) ) {
return $value2 >= $value1 ;
}
if ( ( '<=' === $operator || 'smaller or equal' === $operator || 'equal or smaller' === $operator ) ) {
return $value2 <= $value1 ;
}
if ( ( '>' === $operator || 'greater' === $operator ) ) {
return $value2 > $value1 ;
}
if ( ( '<' === $operator || 'smaller' === $operator ) ) {
return $value2 < $value1 ;
}
if ( 'contains' === $operator || 'in' === $operator ) {
if ( is_array ( $value1 ) && is_array ( $value2 ) ) {
foreach ( $value2 as $val ) {
2019-02-17 14:28:35 +01:00
if ( in_array ( $val , $value1 ) ) { // phpcs:ignore WordPress.PHP.StrictInArray
2019-02-10 20:21:07 +01:00
return true ;
}
}
return false ;
}
if ( is_array ( $value1 ) && ! is_array ( $value2 ) ) {
2019-02-17 14:28:35 +01:00
return in_array ( $value2 , $value1 ); // phpcs:ignore WordPress.PHP.StrictInArray
2019-02-10 20:21:07 +01:00
}
if ( is_array ( $value2 ) && ! is_array ( $value1 ) ) {
2019-02-17 14:28:35 +01:00
return in_array ( $value1 , $value2 ); // phpcs:ignore WordPress.PHP.StrictInArray
2019-02-10 20:21:07 +01:00
}
return ( false !== strrpos ( $value1 , $value2 ) || false !== strpos ( $value2 , $value1 ) );
}
2019-02-17 14:28:35 +01:00
return $value1 == $value2 ; // phpcs:ignore WordPress.PHP.StrictComparisons
2019-02-10 20:21:07 +01:00
}
}