123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- <?php
- if ( ! defined( 'ABSPATH' ) ) {
- exit;
- }
- if ( ! class_exists( 'acf_form_customizer' ) ) :
- class acf_form_customizer {
-
- function __construct() {
-
- $this->preview_values = array();
- $this->preview_fields = array();
- $this->preview_errors = array();
-
- add_action( 'customize_controls_init', array( $this, 'customize_controls_init' ) );
- add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ), 1, 1 );
- add_action( 'customize_save', array( $this, 'customize_save' ), 1, 1 );
-
- add_filter( 'widget_update_callback', array( $this, 'save_widget' ), 10, 4 );
- }
-
- function customize_controls_init() {
-
- acf_enqueue_scripts(
- array(
- 'context' => 'customize_controls',
- )
- );
-
- add_action( 'acf/input/admin_footer', array( $this, 'admin_footer' ), 1 );
- }
-
- function save_widget( $instance, $new_instance, $old_instance, $widget ) {
-
- if ( ! isset( $_POST['wp_customize'] ) || ! isset( $new_instance['acf'] ) || ! acf_verify_nonce( 'widget' ) ) {
- return $instance;
- }
-
- $data = array(
- 'post_id' => "widget_{$widget->id}",
- 'values' => array(),
- 'fields' => array(),
- );
-
- $data['values'] = $new_instance['acf'];
-
- foreach ( $data['values'] as $k => $v ) {
-
- $field = acf_get_field( $k );
-
- if ( ! $field ) {
- continue;
- }
-
- $data['fields'][ $field['name'] ] = $field['key'];
- }
-
- $instance['acf'] = $data;
-
- return $instance;
- }
-
- function settings( $customizer ) {
-
- $data = array();
- $settings = $customizer->settings();
-
- if ( empty( $settings ) ) {
- return false;
- }
-
- foreach ( $settings as $setting ) {
-
- $id = $setting->id;
-
- if ( substr( $id, 0, 6 ) == 'widget' || substr( $id, 0, 7 ) == 'nav_menu' ) {
-
- } else {
- continue;
- }
-
- $value = $setting->post_value();
-
- if ( ! is_array( $value ) || ! isset( $value['acf'] ) ) {
- continue;
- }
-
- $setting->acf = $value['acf'];
-
- $data[] = $setting;
- }
-
- if ( empty( $data ) ) {
- return false;
- }
-
- return $data;
- }
-
- function customize_preview_init( $customizer ) {
-
- $settings = $this->settings( $customizer );
-
- if ( empty( $settings ) ) {
- return;
- }
-
- foreach ( $settings as $setting ) {
-
- $data = $setting->acf;
-
- $this->preview_values[ $data['post_id'] ] = $data['values'];
- $this->preview_fields[ $data['post_id'] ] = $data['fields'];
- }
-
- if ( empty( $this->preview_values ) ) {
- return;
- }
-
- add_filter( 'acf/pre_load_value', array( $this, 'pre_load_value' ), 10, 3 );
- add_filter( 'acf/pre_load_reference', array( $this, 'pre_load_reference' ), 10, 3 );
- }
-
- function pre_load_value( $value, $post_id, $field ) {
-
- if ( isset( $this->preview_values[ $post_id ][ $field['key'] ] ) ) {
- return $this->preview_values[ $post_id ][ $field['key'] ];
- }
-
- return $value;
- }
-
- function pre_load_reference( $field_key, $field_name, $post_id ) {
-
- if ( isset( $this->preview_fields[ $post_id ][ $field_name ] ) ) {
- return $this->preview_fields[ $post_id ][ $field_name ];
- }
-
- return $field_key;
- }
-
- function customize_save( $customizer ) {
-
- $settings = $this->settings( $customizer );
-
- if ( empty( $settings ) ) {
- return;
- }
-
- foreach ( $settings as $setting ) {
-
- $data = $setting->acf;
-
- acf_save_post( $data['post_id'], $data['values'] );
-
- $id_data = $setting->id_data();
- add_filter( 'pre_update_option_' . $id_data['base'], array( $this, 'pre_update_option' ), 10, 3 );
- }
- }
-
- function pre_update_option( $value, $option, $old_value ) {
-
- if ( empty( $value ) ) {
- return $value;
- }
-
-
- foreach ( $value as $i => $widget ) {
-
- if ( ! isset( $widget['acf'] ) ) {
- continue;
- }
-
- unset( $value[ $i ]['acf'] );
- }
-
- return $value;
- }
-
- function admin_footer() {
- ?>
- <script type="text/javascript">
- (function($) {
-
-
- acf.unload.active = 0;
-
-
-
-
-
-
-
-
-
-
- var WidgetControl = wp.customize.Widgets.WidgetControl.prototype;
-
-
-
- WidgetControl.__getInputsSignature = WidgetControl._getInputsSignature;
- WidgetControl.__setInputState = WidgetControl._setInputState;
-
-
-
- WidgetControl._getInputsSignature = function( inputs ) {
-
-
- var signature = this.__getInputsSignature( inputs );
- safe = [];
-
-
-
- signature = signature.split(';');
-
-
-
- for( var i in signature ) {
-
-
- var bit = signature[i];
-
-
-
- if( bit.indexOf('acf') !== -1 ) continue;
-
-
-
- safe.push( bit );
-
- }
-
-
-
- signature = safe.join(';');
-
-
-
- return signature;
-
- };
-
-
-
-
-
- WidgetControl._setInputState = function( input, state ) {
-
- return true;
-
- };
-
- })(jQuery);
- </script>
- <?php
- }
- }
- new acf_form_customizer();
- endif;
- ?>
|