*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class ACFFA_Loader_4
{
public $api_endpoint = 'https://data.jsdelivr.com/v1/package/resolve/gh/FortAwesome/Font-Awesome@4';
public $cdn_baseurl = 'https://cdn.jsdelivr.net/fontawesome/';
public $cdn_filepath = '/css/font-awesome.min.css';
public $current_version = false;
private $version;
public function __construct()
{
$this->version = 'v' . ACFFA_MAJOR_VERSION;
$this->api_endpoint = apply_filters( 'ACFFA_api_endpoint', $this->api_endpoint );
$this->cdn_baseurl = apply_filters( 'ACFFA_cdn_baseurl', $this->cdn_baseurl );
$this->cdn_filepath = apply_filters( 'ACFFA_cdn_filepath', $this->cdn_filepath );
$this->current_version = get_option( 'ACFFA_current_version' );
if ( ! $this->current_version || version_compare( $this->current_version, '5.0.0', '>=' ) ) {
$this->current_version = $this->check_latest_version();
}
if ( ! wp_next_scheduled ( 'ACFFA_refresh_latest_icons' ) ) {
wp_schedule_event( time(), 'daily', 'ACFFA_refresh_latest_icons' );
}
add_action( 'ACFFA_refresh_latest_icons', array( $this, 'refresh_latest_icons' ) );
add_action( 'wp_ajax_acf/fields/font-awesome/query', array( $this, 'select2_ajax_request' ) );
add_filter( 'ACFFA_get_icons', array( $this, 'get_icons' ), 5, 1 );
add_filter( 'ACFFA_get_fa_url', array( $this, 'get_fa_url' ), 5, 1 );
}
public function select2_ajax_request()
{
if ( ! acf_verify_ajax() ) {
die();
}
$response = $this->get_ajax_query( $_POST );
acf_send_ajax_results( $response );
}
private function get_ajax_query( $options = array() )
{
$options = acf_parse_args($options, array(
'post_id' => 0,
's' => '',
'field_key' => '',
'paged' => 1
));
$results = array();
$s = null;
if ( 'default_value' != $options['field_key'] ) {
$field = acf_get_field( $options['field_key'] );
if ( ! $field ) return false;
}
if ( $options['s'] !== '' ) {
$s = strval( $options['s'] );
$s = wp_unslash( $s );
}
if ( isset( $field['icon_sets'] ) // Make sure we have an icon set
&& in_array( 'custom', $field['icon_sets'] ) // Make sure that icon set is 'custom'
&& isset( $field['custom_icon_set'] ) // Make sure a custom set has been chosen
&& stristr( $field['custom_icon_set'], 'ACFFA_custom_icon_list_' . $this->version ) // Make sure that chosen custom set matches this version of FontAwesome
&& $custom_icon_set = get_option( $field['custom_icon_set'] ) // Make sure we can retrieve the icon set from the DB/cache
) {
$fa_icons = array(
'list' => $custom_icon_set
);
} else {
$fa_icons = apply_filters( 'ACFFA_get_icons', array() );
}
if ( $fa_icons ) {
foreach( $fa_icons['list'] as $k => $v ) {
$v = strval( $v );
if ( is_string( $s ) && false === stripos( $v, $s ) ) {
continue;
}
$results[] = array(
'id' => $k,
'text' => $v
);
}
}
$response = array(
'results' => $results
);
return $response;
}
public function refresh_latest_icons()
{
$latest_version = $this->check_latest_version( false );
if ( ! $this->current_version || ! $latest_version ) {
return;
}
if ( version_compare( $this->current_version, $latest_version, '<' ) ) {
update_option( 'ACFFA_current_version', $latest_version, false );
$this->current_version = $latest_version;
$this->get_icons();
}
}
private function check_latest_version( $update_option = true )
{
$latest_version = 'latest';
$remote_get = wp_remote_get( $this->api_endpoint );
if ( ! is_wp_error( $remote_get ) ) {
$response_json = wp_remote_retrieve_body( $remote_get );
if ( $response_json ) {
$response = json_decode( $response_json );
if ( isset( $response->versions ) && ! empty( $response->versions ) ) {
$latest_version = max( $response->versions );
$latest_version = ltrim( $latest_version, 'v' );
if ( $update_option ) {
update_option( 'ACFFA_current_version', $latest_version, false );
}
} else if ( isset( $response->version ) && ! empty( $response->version ) ) {
$latest_version = $response->version;
if ( $update_option ) {
update_option( 'ACFFA_current_version', $latest_version, false );
}
}
}
}
return $latest_version;
}
public function get_icons( $icons = array() )
{
$fa_icons = get_option( 'ACFFA_icon_data' );
if ( empty( $fa_icons ) || ! isset( $fa_icons[ $this->current_version ] ) ) {
$request_url = $this->cdn_baseurl . $this->current_version . $this->cdn_filepath;
$remote_get = wp_remote_get( $request_url );
if ( ! is_wp_error( $remote_get ) ) {
$response = wp_remote_retrieve_body( $remote_get );
if ( ! empty( $response ) ) {
$icons = $this->find_icons( $response );
if ( ! empty( $icons['details'] ) ) {
$fa_icons = array(
$this->current_version => $icons
);
update_option( 'ACFFA_icon_data', $fa_icons, false );
}
}
} else {
update_option( 'ACFFA_cdn_error', true );
}
}
if ( isset( $fa_icons[ $this->current_version ] ) ) {
return $fa_icons[ $this->current_version ];
} else {
return array();
}
}
public function get_fa_url()
{
return $this->cdn_baseurl . $this->current_version . $this->cdn_filepath;
}
private function find_icons( $css )
{
// Modified from Better Font Awesome Library - Thanks Mickey Kay
preg_match_all( '/\.((?:icon-|fa-)[^,}]*)\s*:before\s*{\s*(?:content:)\s*"(\\\\[^"]+)"/s', $css, $matches );
$classes = array_reverse( $matches[1] );
$hex_codes = array_reverse( $matches[2] );
$icons = array(
'list' => array(),
'details' => array(),
'prefix' => false
);
foreach ( $classes as $index => $class ) {
if ( ! empty( $hex_codes[ $index ] ) ) {
$hex = $hex_codes[ $index ];
}
if ( ! $icons['prefix'] ) {
$icons['prefix'] = ( 0 === strpos( $class, 'icon-' ) ) ? 'icon-' : 'fa-';
}
$class_nicename = str_replace( array( 'fa-', 'icon-' ), '', $class );
$unicode = '' . ltrim( $hex, '\\') . ';';
if ( 'fa-' == $icons['prefix'] ) {
$element = '';
} else {
$element = '';
}
$icons['list'][ $class ] = $unicode . ' ' . $class_nicename;
$icons['details'][ $class ] = array(
'hex' => $hex,
'unicode' => $unicode
);
}
ksort( $icons['list'] );
return $icons;
}
}
new ACFFA_Loader_4();