343 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			343 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
/*
 | 
						|
*  ACF Comment Form Class
 | 
						|
*
 | 
						|
*  All the logic for adding fields to comments
 | 
						|
*
 | 
						|
*  @class       acf_form_comment
 | 
						|
*  @package     ACF
 | 
						|
*  @subpackage  Forms
 | 
						|
*/
 | 
						|
 | 
						|
if ( ! class_exists( 'acf_form_comment' ) ) :
 | 
						|
 | 
						|
	class acf_form_comment {
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  __construct
 | 
						|
		*
 | 
						|
		*  This function will setup the class functionality
 | 
						|
		*
 | 
						|
		*  @type    function
 | 
						|
		*  @date    5/03/2014
 | 
						|
		*  @since   5.0.0
 | 
						|
		*
 | 
						|
		*  @param   n/a
 | 
						|
		*  @return  n/a
 | 
						|
		*/
 | 
						|
 | 
						|
		function __construct() {
 | 
						|
 | 
						|
			// actions
 | 
						|
			add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
 | 
						|
 | 
						|
			// render
 | 
						|
			add_filter( 'comment_form_field_comment', array( $this, 'comment_form_field_comment' ), 999, 1 );
 | 
						|
 | 
						|
			// add_action( 'comment_form_logged_in_after',       array( $this, 'add_comment') );
 | 
						|
			// add_action( 'comment_form',                       array( $this, 'add_comment') );
 | 
						|
 | 
						|
			// save
 | 
						|
			add_action( 'edit_comment', array( $this, 'save_comment' ), 10, 1 );
 | 
						|
			add_action( 'comment_post', array( $this, 'save_comment' ), 10, 1 );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  validate_page
 | 
						|
		*
 | 
						|
		*  This function will check if the current page is for a post/page edit form
 | 
						|
		*
 | 
						|
		*  @type    function
 | 
						|
		*  @date    23/06/12
 | 
						|
		*  @since   3.1.8
 | 
						|
		*
 | 
						|
		*  @param   n/a
 | 
						|
		*  @return  (boolean)
 | 
						|
		*/
 | 
						|
 | 
						|
		function validate_page() {
 | 
						|
 | 
						|
			// global
 | 
						|
			global $pagenow;
 | 
						|
 | 
						|
			// validate page
 | 
						|
			if ( $pagenow == 'comment.php' ) {
 | 
						|
 | 
						|
				return true;
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			// return
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  admin_enqueue_scripts
 | 
						|
		*
 | 
						|
		*  This action is run after post query but before any admin script / head actions.
 | 
						|
		*  It is a good place to register all actions.
 | 
						|
		*
 | 
						|
		*  @type    action (admin_enqueue_scripts)
 | 
						|
		*  @date    26/01/13
 | 
						|
		*  @since   3.6.0
 | 
						|
		*
 | 
						|
		*  @param   n/a
 | 
						|
		*  @return  n/a
 | 
						|
		*/
 | 
						|
 | 
						|
		function admin_enqueue_scripts() {
 | 
						|
 | 
						|
			// validate page
 | 
						|
			if ( ! $this->validate_page() ) {
 | 
						|
 | 
						|
				return;
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
			// load acf scripts
 | 
						|
			acf_enqueue_scripts();
 | 
						|
 | 
						|
			// actions
 | 
						|
			add_action( 'admin_footer', array( $this, 'admin_footer' ), 10, 1 );
 | 
						|
			add_action( 'add_meta_boxes_comment', array( $this, 'edit_comment' ), 10, 1 );
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  edit_comment
 | 
						|
		*
 | 
						|
		*  This function is run on the admin comment.php page and will render the ACF fields within custom metaboxes to look native
 | 
						|
		*
 | 
						|
		*  @type    function
 | 
						|
		*  @date    19/10/13
 | 
						|
		*  @since   5.0.0
 | 
						|
		*
 | 
						|
		*  @param   $comment (object)
 | 
						|
		*  @return  n/a
 | 
						|
		*/
 | 
						|
 | 
						|
		function edit_comment( $comment ) {
 | 
						|
 | 
						|
			// vars
 | 
						|
			$post_id = "comment_{$comment->comment_ID}";
 | 
						|
 | 
						|
			// get field groups
 | 
						|
			$field_groups = acf_get_field_groups(
 | 
						|
				array(
 | 
						|
					'comment' => get_post_type( $comment->comment_post_ID ),
 | 
						|
				)
 | 
						|
			);
 | 
						|
 | 
						|
			// render
 | 
						|
			if ( ! empty( $field_groups ) ) {
 | 
						|
 | 
						|
				// render post data
 | 
						|
				acf_form_data(
 | 
						|
					array(
 | 
						|
						'screen'  => 'comment',
 | 
						|
						'post_id' => $post_id,
 | 
						|
					)
 | 
						|
				);
 | 
						|
 | 
						|
				foreach ( $field_groups as $field_group ) {
 | 
						|
 | 
						|
						// load fields
 | 
						|
						$fields = acf_get_fields( $field_group );
 | 
						|
 | 
						|
						// vars
 | 
						|
						$o = array(
 | 
						|
							'id'         => 'acf-' . $field_group['ID'],
 | 
						|
							'key'        => $field_group['key'],
 | 
						|
							// 'style'           => $field_group['style'],
 | 
						|
							'label'      => $field_group['label_placement'],
 | 
						|
							'edit_url'   => '',
 | 
						|
							'edit_title' => __( 'Edit field group', 'acf' ),
 | 
						|
							// 'visibility'  => $visibility
 | 
						|
						);
 | 
						|
 | 
						|
						// edit_url
 | 
						|
						if ( $field_group['ID'] && acf_current_user_can_admin() ) {
 | 
						|
 | 
						|
							$o['edit_url'] = admin_url( 'post.php?post=' . $field_group['ID'] . '&action=edit' );
 | 
						|
 | 
						|
						}
 | 
						|
 | 
						|
						?>
 | 
						|
				<div id="acf-<?php echo $field_group['ID']; ?>" class="stuffbox">
 | 
						|
					<h3 class="hndle"><?php echo $field_group['title']; ?></h3>
 | 
						|
					<div class="inside">
 | 
						|
							<?php acf_render_fields( $fields, $post_id, 'div', $field_group['instruction_placement'] ); ?>
 | 
						|
						<script type="text/javascript">
 | 
						|
						if( typeof acf !== 'undefined' ) {
 | 
						|
								
 | 
						|
							acf.newPostbox(<?php echo json_encode( $o ); ?>);	
 | 
						|
						
 | 
						|
						}
 | 
						|
						</script>
 | 
						|
					</div>
 | 
						|
				</div>
 | 
						|
							<?php
 | 
						|
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  comment_form_field_comment
 | 
						|
		*
 | 
						|
		*  description
 | 
						|
		*
 | 
						|
		*  @type    function
 | 
						|
		*  @date    18/04/2016
 | 
						|
		*  @since   5.3.8
 | 
						|
		*
 | 
						|
		*  @param   $post_id (int)
 | 
						|
		*  @return  $post_id (int)
 | 
						|
		*/
 | 
						|
 | 
						|
		function comment_form_field_comment( $html ) {
 | 
						|
 | 
						|
			// global
 | 
						|
			global $post;
 | 
						|
 | 
						|
			// vars
 | 
						|
			$post_id = false;
 | 
						|
 | 
						|
			// get field groups
 | 
						|
			$field_groups = acf_get_field_groups(
 | 
						|
				array(
 | 
						|
					'comment' => $post->post_type,
 | 
						|
				)
 | 
						|
			);
 | 
						|
 | 
						|
			// bail early if no field groups
 | 
						|
			if ( ! $field_groups ) {
 | 
						|
				return $html;
 | 
						|
			}
 | 
						|
 | 
						|
			// enqueue scripts
 | 
						|
			acf_enqueue_scripts();
 | 
						|
 | 
						|
			// ob
 | 
						|
			ob_start();
 | 
						|
 | 
						|
				// render post data
 | 
						|
				acf_form_data(
 | 
						|
					array(
 | 
						|
						'screen'  => 'comment',
 | 
						|
						'post_id' => $post_id,
 | 
						|
					)
 | 
						|
				);
 | 
						|
 | 
						|
				echo '<div class="acf-comment-fields acf-fields -clear">';
 | 
						|
 | 
						|
			foreach ( $field_groups as $field_group ) {
 | 
						|
 | 
						|
				$fields = acf_get_fields( $field_group );
 | 
						|
 | 
						|
				acf_render_fields( $fields, $post_id, 'p', $field_group['instruction_placement'] );
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
				echo '</div>';
 | 
						|
 | 
						|
			// append
 | 
						|
			$html .= ob_get_contents();
 | 
						|
			ob_end_clean();
 | 
						|
 | 
						|
			// return
 | 
						|
			return $html;
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  save_comment
 | 
						|
		*
 | 
						|
		*  This function will save the comment data
 | 
						|
		*
 | 
						|
		*  @type    function
 | 
						|
		*  @date    19/10/13
 | 
						|
		*  @since   5.0.0
 | 
						|
		*
 | 
						|
		*  @param   comment_id (int)
 | 
						|
		*  @return  n/a
 | 
						|
		*/
 | 
						|
 | 
						|
		function save_comment( $comment_id ) {
 | 
						|
 | 
						|
			// bail early if not valid nonce
 | 
						|
			if ( ! acf_verify_nonce( 'comment' ) ) {
 | 
						|
				return $comment_id;
 | 
						|
			}
 | 
						|
 | 
						|
			// kses
 | 
						|
			if ( isset( $_POST['acf'] ) ) {
 | 
						|
				$_POST['acf'] = wp_kses_post_deep( $_POST['acf'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized with wp_kses_post_deep().
 | 
						|
			}
 | 
						|
 | 
						|
			// validate and save
 | 
						|
			if ( acf_validate_save_post( true ) ) {
 | 
						|
				acf_save_post( "comment_{$comment_id}" );
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		*  admin_footer
 | 
						|
		*
 | 
						|
		*  description
 | 
						|
		*
 | 
						|
		*  @type    function
 | 
						|
		*  @date    27/03/2015
 | 
						|
		*  @since   5.1.5
 | 
						|
		*
 | 
						|
		*  @param   $post_id (int)
 | 
						|
		*  @return  $post_id (int)
 | 
						|
		*/
 | 
						|
 | 
						|
		function admin_footer() {
 | 
						|
 | 
						|
			?>
 | 
						|
<script type="text/javascript">
 | 
						|
(function($) {
 | 
						|
	
 | 
						|
	// vars
 | 
						|
	var $spinner = $('#publishing-action .spinner');
 | 
						|
	
 | 
						|
	
 | 
						|
	// create spinner if not exists (may exist in future WP versions)
 | 
						|
	if( !$spinner.exists() ) {
 | 
						|
		
 | 
						|
		// create spinner
 | 
						|
		$spinner = $('<span class="spinner"></span>');
 | 
						|
		
 | 
						|
		
 | 
						|
		// append
 | 
						|
		$('#publishing-action').prepend( $spinner );
 | 
						|
		
 | 
						|
	}
 | 
						|
	
 | 
						|
})(jQuery);	
 | 
						|
</script>
 | 
						|
			<?php
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	new acf_form_comment();
 | 
						|
 | 
						|
endif;
 | 
						|
 | 
						|
?>
 |