id = $post->ID;
$this->name = $post->post_name;
$this->title = $post->post_title;
$this->is_locale = get_post_meta( $post->ID, '_is_locale', true );
$properties = $this->get_properties();
foreach ( $properties as $key => $value ) {
if ( metadata_exists( 'post', $post->ID, $key ) ) {
$properties[$key] = get_post_meta( $post->ID, $key, true );
}
}
$this->properties = $properties;
}
}
public static function get_instance( $post ) {
$post = get_post( $post );
if ( ! $post || self::post_type != get_post_type( $post ) ) {
return false;
}
return self::$current = new self( $post );
}
public static function count() {
return self::$found_items;
}
public static function get_current() {
return self::$current;
}
public static function register_post_type() {
register_post_type( self::post_type, array(
'labels' => array(
'name' => __( 'Search Forms', 'ivory-search' ),
'singular_name' => __( 'Search Form', 'ivory-search' ),
),
'rewrite' => false,
'query_var' => false,
) );
}
public static function find( $args = '' ) {
$defaults = array(
'post_status' => 'any',
'posts_per_page' => -1,
'offset' => 0,
'orderby' => 'ID',
'order' => 'ASC',
);
$args = wp_parse_args( $args, $defaults );
$args['post_type'] = self::post_type;
$q = new WP_Query();
$posts = $q->query( $args );
self::$found_items = $q->found_posts;
$objs = array();
foreach ( (array) $posts as $post ) {
$objs[] = new self( $post );
}
return $objs;
}
public static function get_template( $args = '' ) {
global $l10n;
$defaults = array( 'locale' => null, 'title' => '' );
$args = wp_parse_args( $args, $defaults );
$locale = $args['locale'];
$title = $args['title'];
if ( $locale ) {
$mo_orig = $l10n['ivory-search'];
$is_i18n = IS_I18n::getInstance();
$is_i18n->load_is_textdomain( $locale );
}
self::$current = $search_form = new self;
$search_form->title =
( $title ? $title : __( 'Untitled', 'ivory-search' ) );
$search_form->locale = ( $locale ? $locale : get_locale() );
$properties = $search_form->get_properties();
foreach ( $properties as $key => $value ) {
$properties[$key] = IS_Template::get_default( $key );
}
$search_form->properties = $properties;
$search_form = apply_filters( 'is_search_form_default_pack',
$search_form, $args );
if ( isset( $mo_orig ) ) {
$l10n['ivory-search'] = $mo_orig;
}
return $search_form;
}
public function __get( $name ) {
$message = __( '%1$s property of a IS_Search_Form object is no longer accessible. Use %2$s method instead.', 'ivory-search' );
if ( 'id' == $name ) {
if ( WP_DEBUG ) {
trigger_error( sprintf( $message, 'id', 'id()' ) );
}
return $this->id;
} elseif ( 'title' == $name ) {
if ( WP_DEBUG ) {
trigger_error( sprintf( $message, 'title', 'title()' ) );
}
return $this->title;
} elseif ( $prop = $this->prop( $name ) ) {
if ( WP_DEBUG ) {
trigger_error(
sprintf( $message, $name, 'prop(\'' . $name . '\')' ) );
}
return $prop;
}
}
public function initial() {
return empty( $this->id );
}
public function prop( $name ) {
$props = $this->get_properties();
return isset( $props[$name] ) ? $props[$name] : null;
}
public function get_properties() {
$properties = (array) $this->properties;
$properties = wp_parse_args( $properties, array(
'_is_includes' => '',
'_is_excludes' => '',
'_is_settings' => '',
) );
$properties = (array) apply_filters( 'is_search_form_properties',
$properties, $this );
return $properties;
}
public function set_properties( $properties ) {
$defaults = $this->get_properties();
$properties = wp_parse_args( $properties, $defaults );
$properties = array_intersect_key( $properties, $defaults );
$this->properties = $properties;
}
public function id() {
return $this->id;
}
public function name() {
return $this->name;
}
public function title() {
return $this->title;
}
public function set_title( $title ) {
$title = strip_tags( $title );
$title = trim( $title );
if ( '' === $title ) {
$title = __( 'Untitled', 'ivory-search' );
}
$this->title = $title;
}
public function locale() {
if ( $this->is_valid_locale( $this->locale ) ) {
return $this->locale;
} else {
return '';
}
}
public function set_locale( $locale ) {
$locale = trim( $locale );
if ( $this->is_valid_locale( $locale ) ) {
$this->locale = $locale;
} else {
$this->locale = 'en_US';
}
}
// Return true if this form is the same one as currently POSTed.
public function is_posted() {
if ( empty( $_POST['_is_unit_tag'] ) ) {
return false;
}
return $this->unit_tag == $_POST['_is_unit_tag'];
}
/* Generating Form HTML */
public function form_html( $args = '' ) {
do_action( 'pre_is_get_search_form' );
remove_filter( 'get_search_form', array( IS_Public::getInstance(), 'get_search_form' ), 99 );
$form = get_search_form( false );
add_filter( 'get_search_form', array( IS_Public::getInstance(), 'get_search_form' ), 99 );
$result = apply_filters( 'is_search_form', $form );
$result = preg_replace('/<\/form>/', '', $result );
$_includes = $this->prop( '_is_includes' );
if ( isset( $_includes['post_type_qs'] ) && 'none' !== $_includes['post_type_qs'] ) {
$result = preg_replace('/<\/form>/', '', $result );
}
if ( null === $result ) {
$result = $form;
}
return $result;
}
/* Settings */
public function setting( $name, $max = 1 ) {
$settings = (array) explode( "\n", $this->prop( 'settings' ) );
$pattern = '/^([a-zA-Z0-9_]+)[\t ]*:(.*)$/';
$count = 0;
$values = array();
foreach ( $settings as $setting ) {
if ( preg_match( $pattern, $setting, $matches ) ) {
if ( $matches[1] != $name ) {
continue;
}
if ( ! $max || $count < (int) $max ) {
$values[] = trim( $matches[2] );
$count += 1;
}
}
}
return $values;
}
public function is_true( $name ) {
$settings = $this->setting( $name, false );
foreach ( $settings as $setting ) {
if ( in_array( $setting, array( 'on', 'true', '1' ) ) ) {
return true;
}
}
return false;
}
/* Save */
public function save() {
$props = $this->get_properties();
$post_content = implode( "\n", $this->array_flatten( $props ) );
if ( $this->initial() ) {
$post_id = wp_insert_post( array(
'post_type' => self::post_type,
'post_status' => 'publish',
'post_title' => $this->title,
'post_content' => trim( $post_content ),
) );
} else {
$post_id = wp_update_post( array(
'ID' => (int) $this->id,
'post_status' => 'publish',
'post_title' => $this->title,
'post_content' => trim( $post_content ),
) );
}
if ( $post_id ) {
foreach ( $props as $prop => $value ) {
update_post_meta( $post_id, $prop, $this->normalize_newline_deep( $value ) );
}
if ( $this->is_valid_locale( $this->locale ) ) {
update_post_meta( $post_id, '_is_locale', $this->locale );
}
if ( $this->initial() ) {
$this->id = $post_id;
do_action( 'is_after_create', $this );
} else {
do_action( 'is_after_update', $this );
}
do_action( 'is_after_save', $this );
}
return $post_id;
}
public function copy() {
$new = new self;
$new->title = $this->title . '_copy';
$new->locale = $this->locale;
$new->properties = $this->properties;
return apply_filters( 'is_copy', $new, $this );
}
public function delete() {
if ( $this->initial() ) {
return;
}
if ( wp_delete_post( $this->id, true ) ) {
$this->id = 0;
return true;
}
return false;
}
public function shortcode( $args = '' ) {
$args = wp_parse_args( $args );
$title = str_replace( array( '"', '[', ']' ), '', $this->title );
$shortcode = sprintf( '[ivory-search id="%1$d" title="%2$s"]',
$this->id, $title );
return apply_filters( 'is_search_form_shortcode', $shortcode, $args, $this );
}
function is_valid_locale( $locale ) {
$pattern = '/^[a-z]{2,3}(?:_[a-zA-Z_]{2,})?$/';
return (bool) preg_match( $pattern, $locale );
}
function normalize_newline( $text, $to = "\n" ) {
if ( ! is_string( $text ) ) {
return $text;
}
$nls = array( "\r\n", "\r", "\n" );
if ( ! in_array( $to, $nls ) ) {
return $text;
}
return str_replace( $nls, $to, $text );
}
function normalize_newline_deep( $arr, $to = "\n" ) {
if ( is_array( $arr ) ) {
$result = array();
foreach ( $arr as $key => $text ) {
$result[$key] = $this->normalize_newline_deep( $text, $to );
}
return $result;
}
return $this->normalize_newline( $arr, $to );
}
function array_flatten( $input ) {
if ( ! is_array( $input ) ) {
return array( $input );
}
$output = array();
foreach ( $input as $value ) {
$output = array_merge( $output, $this->array_flatten( $value ) );
}
return $output;
}
}