cache['field_groups'] ) ) {
return $this->cache['field_groups'];
}
$sql = "
SELECT p.ID, p.post_title,
m1.meta_value as fields,
m2.meta_value AS rules,
m3.meta_value AS extras
FROM $wpdb->posts p
INNER JOIN $wpdb->postmeta m1 ON m1.post_id = p.ID AND m1.meta_key = 'cfs_fields'
INNER JOIN $wpdb->postmeta m2 ON m2.post_id = p.ID AND m2.meta_key = 'cfs_rules'
INNER JOIN $wpdb->postmeta m3 ON m3.post_id = p.ID AND m3.meta_key = 'cfs_extras'
WHERE p.post_status = 'publish'";
$results = $wpdb->get_results( $sql );
$output = array();
foreach ( $results as $result ) {
$output[ $result->ID ] = array(
'title' => $result->post_title,
'fields' => unserialize( $result->fields ),
'rules' => unserialize( $result->rules ),
'extras' => unserialize( $result->extras )
);
}
$this->cache['field_groups'] = $output;
return $output;
}
/*
================================================================
Import field groups
================================================================
*/
public function import( $options ) {
global $wpdb;
if ( ! empty( $options['import_code'] ) ) {
// Collect stats
$stats = array();
// Get all existing field group names
$existing_groups = $wpdb->get_col( "SELECT post_name FROM {$wpdb->posts} WHERE post_type = 'cfs'" );
// Loop through field groups
foreach ( $options['import_code'] as $group ) {
// Make sure this field group doesn't exist
if ( ! in_array( $group['post_name'], $existing_groups ) ) {
// Insert new post
$post_id = wp_insert_post( array(
'post_title' => $group['post_title'],
'post_name' => $group['post_name'],
'post_type' => 'cfs',
'post_status' => 'publish',
'post_content' => '',
'post_content_filtered' => '',
'post_excerpt' => '',
'to_ping' => '',
'pinged' => '',
) );
// Generate new field IDs
$field_id_mapping = array();
$next_field_id = (int) get_option( 'cfs_next_field_id' );
foreach ( $group['cfs_fields'] as $key => $data ) {
$id = $group['cfs_fields'][ $key ]['id'];
$parent_id = $group['cfs_fields'][ $key ]['parent_id'];
$field_id_mapping[ $id ] = $next_field_id;
$group['cfs_fields'][ $key ]['id'] = $next_field_id;
if ( 0 < (int) $parent_id ) {
$group['cfs_fields'][ $key ]['parent_id'] = $field_id_mapping[ $parent_id ];
}
$next_field_id++;
}
update_option( 'cfs_next_field_id', $next_field_id );
update_post_meta( $post_id, 'cfs_fields', $group['cfs_fields'] );
update_post_meta( $post_id, 'cfs_rules', $group['cfs_rules'] );
update_post_meta( $post_id, 'cfs_extras', $group['cfs_extras'] );
$stats['imported'][] = $group['post_title'];
}
else {
$stats['skipped'][] = $group['post_title'];
}
}
$return = '';
if ( ! empty( $stats['imported'] ) ) {
$return .= '
' . __( 'Imported', 'cfs' ) . ': ' . implode( ', ', $stats['imported'] ) . '
';
}
if ( ! empty( $stats['skipped'] ) ) {
$return .= '' . __( 'Skipped', 'cfs' ) . ': ' . implode( ', ', $stats['skipped'] ) . '
';
}
return $return;
}
else {
return '' . __( 'Nothing to import', 'cfs' ) . '
';
}
}
/*
================================================================
Export field groups
================================================================
*/
public function export( $options ) {
global $wpdb;
$post_ids = array();
$field_groups = array();
foreach ( $options['field_groups'] as $post_id ) {
$post_ids[] = (int) $post_id;
}
$post_ids = implode( ',', $post_ids );
$post_data = $wpdb->get_results( "SELECT ID, post_title, post_name FROM {$wpdb->posts} WHERE post_type = 'cfs' AND ID IN ($post_ids)" );
foreach ( $post_data as $row ) {
$field_groups[ $row->ID ] = array(
'post_title' => $row->post_title,
'post_name' => $row->post_name,
);
}
$meta_data = $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} WHERE meta_key LIKE 'cfs_%' AND post_id IN ($post_ids)" );
foreach ( $meta_data as $row ) {
$value = unserialize( $row->meta_value );
$field_groups[ $row->post_id ][ $row->meta_key ] = $value;
}
// Strip out the field group keys
$temp = array();
foreach ( $field_groups as $field_group ) {
$temp[] = $field_group;
}
$field_groups = $temp;
return $field_groups;
}
/**
* Save field group settings
* @param array $params
*/
function save( $params = array() ) {
global $wpdb;
$post_id = $params['post_id'];
/*---------------------------------------------------------------------------------------------
Save fields
---------------------------------------------------------------------------------------------*/
$weight = 0;
$prev_fields = array();
$current_field_ids = array();
$next_field_id = (int) get_option( 'cfs_next_field_id' );
$existing_fields = get_post_meta( $post_id, 'cfs_fields', true );
if ( ! empty( $existing_fields ) ) {
foreach ( $existing_fields as $item ) {
$prev_fields[ $item['id'] ] = $item['name'];
}
}
$new_fields = array();
foreach ( $params['fields'] as $key => $field ) {
// Sanitize the field
$field = stripslashes_deep( $field );
// Allow for field customizations
$field = CFS()->fields[ $field['type'] ]->pre_save_field( $field );
// Set the parent ID
$field['parent_id'] = empty( $field['parent_id'] ) ? 0 : (int) $field['parent_id'];
// Save empty array for fields without options
$field['options'] = empty( $field['options'] ) ? array() : $field['options'];
// Use an existing ID if available
if ( 0 < (int) $field['id'] ) {
// We use this variable to check for deleted fields
$current_field_ids[] = $field['id'];
// Rename the postmeta key if necessary
if ( $field['name'] != $prev_fields[ $field['id'] ] ) {
$wpdb->query(
$wpdb->prepare("
UPDATE {$wpdb->postmeta} m
INNER JOIN {$wpdb->prefix}cfs_values v ON v.meta_id = m.meta_id
SET meta_key = %s
WHERE v.field_id = %d",
$field['name'], $field['id']
)
);
}
}
else {
$field['id'] = $next_field_id;
$next_field_id++;
}
$data = array(
'id' => $field['id'],
'name' => $field['name'],
'label' => $field['label'],
'type' => $field['type'],
'notes' => $field['notes'],
'parent_id' => $field['parent_id'],
'weight' => $weight,
'options' => $field['options'],
);
$new_fields[] = $data;
$weight++;
}
// Save the fields
update_post_meta( $post_id, 'cfs_fields', $new_fields );
// Update the field ID counter
update_option( 'cfs_next_field_id', $next_field_id );
// Remove values for deleted fields
$deleted_field_ids = array_diff( array_keys( $prev_fields ), $current_field_ids );
if ( 0 < count( $deleted_field_ids ) ) {
$deleted_field_ids = implode( ',', $deleted_field_ids );
$wpdb->query("
DELETE v, m
FROM {$wpdb->prefix}cfs_values v
INNER JOIN {$wpdb->postmeta} m ON m.meta_id = v.meta_id
WHERE v.field_id IN ($deleted_field_ids)"
);
}
/*---------------------------------------------------------------------------------------------
Save rules
---------------------------------------------------------------------------------------------*/
$data = array();
$rule_types = array( 'post_types', 'post_formats', 'user_roles', 'post_ids', 'term_ids', 'page_templates' );
foreach ( $rule_types as $type ) {
if ( ! empty( $params['rules'][ $type ] ) ) {
// Break apart the autocomplete string
if ( 'post_ids' == $type ) {
$params['rules'][ $type ] = explode( ',', $params['rules'][ $type ] );
}
$data[ $type ] = array(
'operator' => $params['rules']['operator'][ $type ],
'values' => $params['rules'][ $type ],
);
}
}
$data = apply_filters( 'cfs_save_field_group_rules', $data, $post_id );
update_post_meta( $post_id, 'cfs_rules', $data );
/*---------------------------------------------------------------------------------------------
Save extras
---------------------------------------------------------------------------------------------*/
update_post_meta( $post_id, 'cfs_extras', $params['extras'] );
}
}
CFS()->field_group = new cfs_field_group();