/home/sylamedg/www/wp-content/plugins/cc-child-pages/includes/ccchildpages_widget.php
<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

/**
 * ccchildpages_widget
 */
class ccchildpages_widget extends WP_Widget {


	/**
	 * Sets up the widgets name etc
	 */
	public function __construct() {
		parent::__construct(
			'ccchildpages_widget', // Base ID
			__( 'CC Child Pages', 'cc-child-pages' ), // Name
			array( 'description' => __( 'Displays current child pages as a menu', 'cc-child-pages' ) ) // Args
		);
	}

	/**
	 * Outputs the content of the widget
	 *
	 * @param array $args
	 * @param array $instance
	 */
	public function widget( $args, $instance ) {
		// outputs the content of the widget

		$sortby       = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];
		$exclude      = empty( $instance['exclude'] ) ? '' : $instance['exclude'];
		$exclude_tree = empty( $instance['exclude_tree'] ) ? '' : $instance['exclude_tree'];
		$showall      = empty( $instance['showall'] ) ? 'off' : $instance['showall'];
		$showtitle    = empty( $instance['showtitle'] ) ? 'off' : $instance['showtitle'];
		$siblings     = empty( $instance['siblings'] ) ? 'off' : $instance['siblings'];
		$parent_id    = empty( $instance['parent'] ) ? -1 : $instance['parent'];
		$depth        = empty( $instance['depth'] ) ? 0 : $instance['depth'];

		if ( $showall == 'off' && $siblings == 'off' && ( $parent_id == -1 ) && ( ! is_page() ) ) {
			return; // If we are not viewing a page AND a parent page has not been specified AND  we are not viewing ALL pages, don't show widget at all ...
		}

		if ( $siblings != 'off' ) {
			$parent_id = wp_get_post_parent_id( get_the_ID() );

			if ( $exclude_tree != '' ) {
				// exclude tree already has a list, so add a comma to the end
				$exclude_tree .= ',';
			}

			// Add current page id to exclude tree list ...
			$exclude_tree .= get_the_ID();
		} elseif ( $showall != 'off' ) {
			$parent_id = 0;
		} elseif ( $parent_id == -1 ) {
			$parent_id = get_the_ID();
		}

		$widget_title = $instance['title'];

		if ( $parent_id > 0 && $showtitle != 'off' ) {
			$widget_title = get_the_title( $parent_id );
		}

		if ( $sortby == 'menu_order' ) {
			$sortby = 'menu_order, post_title';
		}

		$out = wp_list_pages(
			apply_filters(
				'ccchildpages_widget_pages_args',
				array(
					'title_li'     => '',
					'child_of'     => $parent_id,
					'echo'         => 0,
					'depth'        => $depth,
					'sort_column'  => $sortby,
					'exclude'      => $exclude,
					'exclude_tree' => $exclude_tree,
				),
				$args,
				$instance
			)
		);

		if ( empty( $out ) ) {
			return; // Give up if the page has no children
		}

		$ul_open  = apply_filters( 'ccchildpages_widget_start_ul', '<ul>', $args, $instance );
		$ul_close = apply_filters( 'ccchildpages_widget_end_ul', '</ul>', $args, $instance );

		$out = apply_filters( 'ccchildpages_widget_output', $ul_open . $out . $ul_close, $args, $instance );

		$out = apply_filters( 'ccchildpages_before_widget', $args['before_widget'], $args, $instance ) . $out;
		if ( ! empty( $widget_title ) ) {
			$before_title = apply_filters( 'ccchildpages_widget_before_title', $args['before_title'], $args, $instance );
			$after_title  = apply_filters( 'ccchildpages_widget_after_title', $args['after_title'], $args, $instance );
			$out          = $before_title . apply_filters( 'widget_title', $widget_title, $args, $instance ) . $after_title . $out;
		}
		$out = $out . apply_filters( 'ccchildpages_after_widget', $args['after_widget'], $args, $instance );
		echo wp_kses_post( $out );
	}

	/**
	 * Outputs the options form on admin
	 *
	 * @param array $instance The widget options
	 */
	public function form( $instance ) {
		// outputs the options form on admin

		$title        = ( isset( $instance['title'] ) ? $instance['title'] : '' );
		$exclude      = ( isset( $instance['exclude'] ) ? $instance['exclude'] : '' );
		$exclude_tree = ( isset( $instance['exclude_tree'] ) ? $instance['exclude_tree'] : '' );
		$sortby       = ( isset( $instance['sortby'] ) ? $instance['sortby'] : '' );
		$showall      = ( isset( $instance['showall'] ) ? $instance['showall'] : 'off' );
		$showtitle    = ( isset( $instance['showtitle'] ) ? $instance['showtitle'] : 'off' );
		$siblings     = ( isset( $instance['siblings'] ) ? $instance['siblings'] : 'off' );
		$parent_id    = ( isset( $instance['parent'] ) ? intval( $instance['parent'] ) : -1 );
		$depth        = ( isset( $instance['depth'] ) ? intval( $instance['depth'] ) : 0 );
		?>
		<p>
			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'cc-child-pages' ); ?></label>
			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>">
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'showtitle' ); ?>"><?php _e( 'Show Page Title:', 'cc-child-pages' ); ?></label> <input type="checkbox" <?php checked( $showtitle, 'on' ); ?> name="<?php echo $this->get_field_name( 'showtitle' ); ?>" id="<?php echo $this->get_field_id( 'showtitle' ); ?>" class="checkbox" />
			<br />
			<small><?php _e( 'Overrides the Title field, unless parent page has no parent.', 'cc-child-pages' ); ?></small>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'sortby' ); ?>"><?php _e( 'Sort by:', 'cc-child-pages' ); ?></label>
			<select name="<?php echo $this->get_field_name( 'sortby' ); ?>" id="<?php echo $this->get_field_id( 'sortby' ); ?>" class="widefat">
				<option value="post_title" <?php selected( $sortby, 'post_title' ); ?>><?php _e( 'Page title', 'cc-child-pages' ); ?></option>
				<option value="menu_order" <?php selected( $sortby, 'menu_order' ); ?>><?php _e( 'Page order', 'cc-child-pages' ); ?></option>
				<option value="ID" <?php selected( $sortby, 'ID' ); ?>><?php _e( 'Page ID', 'cc-child-pages' ); ?></option>
				<option value="post_date" <?php selected( $sortby, 'post_date' ); ?>><?php _e( 'Date created', 'cc-child-pages' ); ?></option>
				<option value="post_modified" <?php selected( $sortby, 'post_modified' ); ?>><?php _e( 'Date modified', 'cc-child-pages' ); ?></option>
				<option value="post_author" <?php selected( $sortby, 'post_author' ); ?>><?php _e( 'Page author', 'cc-child-pages' ); ?></option>
				<option value="comment_count" <?php selected( $sortby, 'comment_count' ); ?>><?php _e( 'Comment count', 'cc-child-pages' ); ?></option>
				<option value="rand" <?php selected( $sortby, 'rand' ); ?>><?php _e( 'Random', 'cc-child-pages' ); ?></option>
			</select>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'exclude' ); ?>"><?php _e( 'Exclude:', 'cc-child-pages' ); ?></label> <input type="text" value="<?php echo $this->sanitize_numbers( $exclude, true ); ?>" name="<?php echo $this->get_field_name( 'exclude' ); ?>" id="<?php echo $this->get_field_id( 'exclude' ); ?>" class="widefat" />
			<br />
			<small><?php _e( 'Page IDs, separated by commas.', 'cc-child-pages' ); ?></small>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'exclude_tree' ); ?>"><?php _e( 'Exclude Tree:', 'cc-child-pages' ); ?></label> <input type="text" value="<?php echo $this->sanitize_numbers( $exclude_tree, true ); ?>" name="<?php echo $this->get_field_name( 'exclude_tree' ); ?>" id="<?php echo $this->get_field_id( 'exclude_tree' ); ?>" class="widefat" />
			<br />
			<small><?php _e( 'Page IDs, separated by commas.<br />Similar to Exclude, but will also exclude children of the pages in the list.', 'cc-child-pages' ); ?></small>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'showall' ); ?>"><?php _e( 'Show All Pages:', 'cc-child-pages' ); ?></label> <input type="checkbox" <?php checked( $showall, 'on' ); ?> name="<?php echo $this->get_field_name( 'showall' ); ?>" id="<?php echo $this->get_field_id( 'showall' ); ?>" class="checkbox" />
			<br />
			<small><?php _e( 'Overrides the Parent field, shows all top-level pages.', 'cc-child-pages' ); ?></small>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'siblings' ); ?>"><?php _e( 'Show Sibling Pages:', 'cc-child-pages' ); ?></label> <input type="checkbox" <?php checked( $siblings, 'on' ); ?> name="<?php echo $this->get_field_name( 'siblings' ); ?>" id="<?php echo $this->get_field_id( 'siblings' ); ?>" class="checkbox" />
			<br />
			<small><?php _e( 'Overrides the Parent and Show All field, shows sibling pages.', 'cc-child-pages' ); ?></small>
		</p>
		<p>
			<?php
			$args = array(
				'depth'                 => $depth,
				'child_of'              => 0,
				'selected'              => $parent_id,
				'sort_column'           => 'menu_order',
				'echo'                  => 1,
				'name'                  => $this->get_field_name( 'parent' ),
				'id'                    => $this->get_field_name( 'parent' ), // string
				'show_option_none'      => 'Current Page', // string
				'show_option_no_change' => null, // string
				'option_none_value'     => -1, // string
			);
			?>
			<label for="<?php echo $this->get_field_id( 'parent' ); ?>"><?php _e( 'Parent:', 'cc-child-pages' ); ?></label> <?php wp_dropdown_pages( $args ); ?>
		</p>
		<p>
			<label for="<?php echo $this->get_field_id( 'depth' ); ?>"><?php _e( 'Depth:', 'cc-child-pages' ); ?></label> <input type="text" value="<?php echo intval( $depth ); ?>" name="<?php echo $this->get_field_name( 'depth' ); ?>" id="<?php echo $this->get_field_id( 'depth' ); ?>" class="widefat" />
			<br />
			<small>
				<ul>
					<li>0 - <?php _e( 'Pages and sub-pages displayed in hierarchical (indented) form (Default).', 'cc-child-pages' ); ?></li>
					<li>-1 - <?php _e( 'Pages in sub-pages displayed in flat (no indent) form.', 'cc-child-pages' ); ?></li>
					<li>1 - <?php _e( 'Show only top level Pages', 'cc-child-pages' ); ?></li>
					<li>2 - <?php _e( 'Value of 2 (or greater) specifies the depth (or level) to descend in displaying Pages.', 'cc-child-pages' ); ?></li>
				</ul>
			</small>
		</p>
		<?php
	}

	/**
	 * Processing widget options on save
	 *
	 * @param array $new_instance The new options
	 * @param array $old_instance The previous options
	 */
	public function update( $new_instance, $old_instance ) {
		// processes widget options to be saved
		$instance           = array();
		$instance['title']  = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
		$instance['parent'] = ( ! empty( $new_instance['parent'] ) ) ? strip_tags( $new_instance['parent'] ) : -1;
		$instance['depth']  = ( ! empty( $new_instance['depth'] ) ) ? strip_tags( $new_instance['depth'] ) : 0;

		if ( in_array( $new_instance['sortby'], array( 'post_title', 'menu_order', 'ID', 'post_author', 'post_date', 'post_modified', 'comment_count', 'rand' ) ) ) {
			$instance['sortby'] = $new_instance['sortby'];
		} else {
			$instance['sortby'] = 'menu_order';
		}

		$instance['exclude']      = strip_tags( $new_instance['exclude'] );
		$instance['exclude_tree'] = strip_tags( $new_instance['exclude_tree'] );

		if ( isset( $new_instance['showall'] ) ) {
			$instance['showall'] = $new_instance['showall'];
		} else {
			$instance['showall'] = 'off';
		}

		if ( isset( $new_instance['showtitle'] ) ) {
			$instance['showtitle'] = $new_instance['showtitle'];
		} else {
			$instance['showtitle'] = 'off';
		}

		if ( isset( $new_instance['siblings'] ) ) {
			$instance['siblings'] = $new_instance['siblings'];
		} else {
			$instance['siblings'] = 'off';
		}

		return $instance;
	}

	public static function has_children() {
		// return number of children for current page
		global $post;
		return count(
			get_posts(
				array(
					'post_parent' => $post->ID,
					'post_type'   => $post->post_type,
				)
			)
		);
	}

	public static function sanitize_numbers( $num, $list = false ) {
		if ( $list ) {
			return preg_replace( '/[^0-9,]+/', '', $num );
		} else {
			return preg_replace( '/[^0-9]+/', '', $num );
		}
	}
}
?>