<?php
/**
* Post storage model for editability
*
* @since 1.0
*/
class CACIE_Editable_Model_Post extends CACIE_Editable_Model {
/**
* @see CACIE_Editable_Model::is_editable()
* @since 1.0
*/
public function is_editable( $column ) {
// By default, inherit editability from parent
$is_editable = parent::is_editable( $column );
switch ( $column->properties->type ) {
// Default columns
case 'author':
case 'date':
case 'categories':
case 'tags':
case 'title':
// Custom columns
case 'column-author_name':
case 'column-attachment':
case 'column-comment_status':
case 'column-content':
case 'column-date_published':
case 'column-excerpt':
case 'column-featured_image':
case 'column-order':
case 'column-page_template':
case 'column-parent':
case 'column-ping_status':
case 'column-post_formats':
case 'column-slug':
case 'column-status':
case 'column-sticky':
case 'column-taxonomy':
// WooCommerce columns
// Product
case 'thumb':
case 'name':
case 'sku':
case 'is_in_stock':
case 'price':
case 'product_cat':
case 'product_tag':
case 'column-wc-backorders_allowed':
case 'column-wc-crosssells':
case 'column-wc-dimensions':
case 'column-wc-featured':
case 'column-wc-parent':
case 'column-wc-reviews_enabled':
case 'column-wc-shipping_class':
case 'column-wc-stock-status':
case 'column-wc-upsells':
case 'column-wc-visibility':
case 'column-wc-weight':
// Order
case 'order_status':
// Coupon
case 'coupon_code':
case 'type':
case 'amount':
case 'description':
case 'usage':
case 'column-wc-apply_before_tax':
case 'column-wc-exclude_products':
case 'column-wc-free_shipping':
case 'column-wc-include_products':
case 'column-wc-minimum_amount':
$is_editable = true;
break;
}
/**
* Filter the editability of a column
*
* @since 3.4
*
* @param bool $is_editable Whether the column is editable
* @param CPAC_Column $column Column object
* @param CACIE_Editable_Model $model Editability storage model
*/
$is_editable = apply_filters( 'cac/editable/is_column_editable', $is_editable, $column, $this );
$is_editable = apply_filters( 'cac/editable/is_column_editable/column=' . $column->get_type(), $is_editable, $column, $this );
return $is_editable;
}
/**
* @see CACIE_Editable_Model::get_column_options()
* @since 1.0
*/
public function get_column_options( $column ) {
$options = parent::get_column_options( $column );
switch ( $column['type'] ) {
// WP Default
case 'categories':
$options = $this->get_term_options( 'category' );
break;
case 'tags':
$options = $this->get_term_options( 'post_tag' );
break;
// Custom columns
case 'column-page_template':
$options = $this->get_page_template_options();
break;
case 'column-post_formats':
$options = get_post_format_strings();
break;
case 'column-status':
$options = get_post_statuses();
$options['trash'] = __( 'Trash' );
break;
case 'column-taxonomy':
$options = $this->get_term_options( $column['taxonomy'] );
break;
// WooCommerce columns
case 'product_cat':
$options = $this->get_term_options( 'product_cat' );
break;
case 'product_tag':
$options = $this->get_term_options( 'product_tag' );
break;
case 'order_status':
$options = $this->get_wc_order_status_options();
break;
case 'column-wc-visibility':
if ( $_column_object = $this->storage_model->get_column_by_name( $column['column-name'] ) ) {
$options = $_column_object->get_visibility_options();
}
break;
case 'column-wc-shipping_class':
$options = $this->get_term_options( 'product_shipping_class', __( 'No shipping class', 'codepress-admin-columns' ) );
break;
}
return $options;
}
/**
* Get page template columns
*
* @since 1.0
*
* @return array Parent post options
*/
public function get_page_template_options() {
return array_merge( array( '' => __( 'Default Template' ) ), array_flip( (array) get_page_templates() ) );
}
/**
* Get order status options for WooCommerce orders
*
* @since 1.1
*
* @return array Order status options ([slug] => [label])
*/
public function get_wc_order_status_options() {
$statuses = array();
if ( cpac_is_wc_version_gte( '2.2' ) ) {
$statuses = wc_get_order_statuses();
}
else {
$statuses_raw = (array) get_terms( 'shop_order_status', array( 'hide_empty' => 0, 'orderby' => 'id' ) );
foreach ( $statuses_raw as $status ) {
$statuses[ $status->slug ] = $status->name;
}
}
return $statuses;
}
/**
* Get post parent columns
*
* @since 1.0
*
* @return array Parent post options ([post ID] => [post title])
*/
public function get_post_parent_options() {
$options = array();
$posts_query = new WP_Query( array(
'post_type' => $this->storage_model->key,
'posts_per_page' => -1
) );
if ( $posts_query->have_posts() ) {
$nestedposts = CACIE_Arrays::array_nest( $posts_query->posts, 0, 'post_parent', 'ID', 'cacie_children' );
$indentedposts = CACIE_Arrays::convert_nesting_to_indentation( $nestedposts, 'post_title', 'cacie_children' );
foreach ( $indentedposts as $post ) {
$options[ $post->ID ] = $post->post_title;
}
}
return $options;
}
/**
* @see CACIE_Editable_Model::get_editables_data()
* @since 1.0
*/
public function get_editables_data() {
$data = array(
/**
* Default columns
*
*/
'author' => array(
'type' => 'select2_dropdown',
'property' => 'post_author',
'ajax_populate' => true,
'formatted_value' => 'user'
),
'categories' => array(
'type' => 'select2_tags'
),
'date' => array(
'type' => 'date',
'property' => 'post_date'
),
'tags' => array(
'type' => 'select2_tags'
),
'title' => array(
'type' => 'text',
'property' => 'post_title',
'js' => array(
'selector' => 'a.row-title',
),
'display_ajax' => false
),
/**
* Custom columns
*
*/
'column-author_name' => array(
'type' => 'select2_dropdown',
'property' => 'post_author',
'ajax_populate' => true,
'formatted_value' => 'user'
),
'column-attachment' => array(
'type' => 'media',
'attachment' => array(
'disable_select_current' => true,
),
'multiple' => true
),
'column-comment_status' => array(
'type' => 'togglable',
'property' => 'comment_status',
'options' => array( 'closed', 'open' )
),
'column-date_published' => array(
'type' => 'date',
'property' => 'post_date'
),
'column-excerpt' => array(
'type' => 'textarea',
'property' => 'post_excerpt',
'placeholder' => __( 'Excerpt automatically generated from content.', 'codepress-admin-columns' )
),
'column-featured_image' => array(
'type' => 'media',
'attachment' => array(
'library' => array(
'type' => 'image'
)
),
'clear_button' => true
),
'column-post_formats' => array(
'type' => 'select'
),
'column-page_template' => array(
'type' => 'select'
),
'column-parent' => array(
'type' => 'select2_dropdown',
'property' => 'post_parent',
'ajax_populate' => true,
'multiple' => false,
'clear_button' => true
),
'column-ping_status' => array(
'type' => 'togglable',
'property' => 'ping_status',
'options' => array( 'closed', 'open' )
),
'column-content' => array(
'type' => 'textarea',
'property' => 'post_content',
),
'column-order' => array(
'type' => 'text',
'property' => 'menu_order',
),
'column-slug' => array(
'type' => 'text',
'property' => 'post_name',
),
'column-sticky' => array(
'type' => 'togglable',
'options' => array( 'no', 'yes' )
),
// @todo on DOM update also refresh title ( contains post status aswell )
'column-status' => array(
'type' => 'select',
'property' => 'post_status'
),
'column-taxonomy' => array(
'type' => 'select2_tags'
),
/**
* Custom fields column
*
*/
'column-meta' => array(
// settings are set in CACIE_Editable_Model::get_columns()
)
);
/**
* WooCommerce columns
*
*/
if ( function_exists( 'WC' ) ) {
$wc_data = array(
'name' => array(
'type' => 'text',
'property' => 'post_title',
'js' => array(
'selector' => 'a.row-title',
),
'display_ajax' => false
),
'amount' => array(
'type' => 'text'
),
'column-wc-minimum_amount' => array(
'type' => 'text'
),
'order_status' => array(
'type' => 'select'
),
'coupon_code' => array(
'type' => 'text',
'js' => array(
'selector' => '.row-actions'
),
'property' => 'post_title'
),
'column-wc-free_shipping' => array(
'type' => 'togglable',
'options' => array( 'no', 'yes' )
),
'column-wc-apply_before_tax' => array(
'type' => 'togglable',
'options' => array( 'no', 'yes' )
),
'price' => array(
'type' => 'wc_price'
),
'column-wc-weight' => array(
'type' => 'float',
'js' => array(
'inputclass' => 'small-text'
)
),
'column-wc-dimensions' => array(
'type' => 'dimensions'
),
'sku' => array(
'type' => 'text'
),
'is_in_stock' => array(
'type' => 'wc_stock'
),
'column-wc-stock-status' => array(
'type' => 'togglable',
'options' => array( 'outofstock', 'instock' )
),
'type' => array(
'type' => 'select',
'options' => wc_get_coupon_types()
),
'thumb' => array(
'type' => 'media',
'attachment' => array(
'library' => array(
'type' => 'image'
)
),
'clear_button' => true
),
'column-wc-upsells' => array(
'type' => 'select2_dropdown',
'ajax_populate' => true,
'advanced_dropdown' => true,
'multiple' => true,
'formatted_value' => 'wc_product'
),
'column-wc-crosssells' => array(
'type' => 'select2_dropdown',
'ajax_populate' => true,
'advanced_dropdown' => true,
'multiple' => true,
'formatted_value' => 'wc_product'
),
'column-wc-parent' => array(
'type' => 'select2_dropdown',
'ajax_populate' => true,
'advanced_dropdown' => true,
'clear_button' => true
),
'column-wc-exclude_products' => array(
'type' => 'select2_dropdown',
'ajax_populate' => true,
'advanced_dropdown' => true,
'multiple' => true,
'formatted_value' => 'wc_product'
),
'column-wc-include_products' => array(
'type' => 'select2_dropdown',
'ajax_populate' => true,
'advanced_dropdown' => true,
'multiple' => true,
'formatted_value' => 'wc_product'
),
'column-wc-shipping_class' => array(
'type' => 'select'
),
'usage' => array(
'type' => 'wc_usage'
),
'description' => array(
'type' => 'textarea',
'property' => 'post_excerpt'
),
'column-wc-reviews_enabled' => array(
'type' => 'togglable',
'property' => 'comment_status',
'options' => array( 'closed', 'open' )
),
'column-wc-backorders_allowed' => array(
'type' => 'select',
'options' => array(
'no' => __( 'Do not allow', 'woocommerce' ),
'notify' => __( 'Allow, but notify customer', 'woocommerce' ),
'yes' => __( 'Allow', 'woocommerce' )
)
),
// Products
'product_cat' => array(
'type' => 'select2_tags'
),
'product_tag' => array(
'type' => 'select2_tags'
),
'column-wc-featured' => array(
'type' => 'togglable',
'options' => array( 'no', 'yes' )
),
'column-wc-visibility' => array(
'type' => 'select',
)
);
$data = array_merge( $wc_data, $data );
}
// Handle capabilities for editing post status
$post_type_object = get_post_type_object( $this->storage_model->get_post_type() );
if ( ! current_user_can( $post_type_object->cap->publish_posts ) ) {
unset( $data['column-status'] );
}
/**
* Filter the editability settings for a column
*
* @since 3.4
*
* @param array $data {
* Editability settings.
*
* @type string $type Editability type. Accepts 'text', 'select', 'textarea', etc.
* @type array $options Optional. Options for dropdown ([value] => [label]), only used when $type is "select"
* }
* @param CACIE_Editable_Model $model Editability storage model
*/
$data = apply_filters( 'cac/editable/editables_data', $data, $this );
$data = apply_filters( 'cac/editable/editables_data/type=' . $this->storage_model->get_type(), $data, $this );
$data = apply_filters( 'cac/editable/editables_data/post_type=' . $this->storage_model->get_post_type(), $data, $this );
return $data;
}
/**
* @see CACIE_Editable_Model::get_items()
* @since 1.0
*/
public function get_items() {
global $wp_query;
$items = array();
foreach ( (array) $wp_query->posts as $post ) {
if ( ! current_user_can( 'edit_post', $post->ID ) ) {
continue;
}
$columndata = array();
foreach ( $this->storage_model->columns as $column_name => $column ) {
// Edit enabled for this column?
if ( ! $this->is_edit_enabled( $column ) ) {
continue;
}
// Set current value
$value = '';
// WP Default column
if ( $column->properties->default ) {
switch ( $column_name ) {
case 'author':
$value = $post->post_author;
break;
case 'date':
$value = date( 'Ymd', strtotime( $post->post_date ) );
break;
case 'categories':
$term_ids = wp_get_post_terms( $post->ID, 'category', array( 'fields' => 'ids' ) );
if ( $term_ids && ! is_wp_error( $term_ids ) ) {
$value = $term_ids;
}
break;
case 'tags':
$term_ids = wp_get_post_terms( $post->ID, 'post_tag', array( 'fields' => 'ids' ) );
if ( $term_ids && ! is_wp_error( $term_ids ) ) {
$value = $term_ids;
}
break;
case 'name': // woocommerce default
case 'title':
$value = $post->post_title;
break;
case 'product_cat':
$term_ids = wp_get_post_terms( $post->ID, 'product_cat', array( 'fields' => 'ids' ) );
if ( $term_ids && ! is_wp_error( $term_ids ) ) {
$value = $term_ids;
}
break;
case 'product_tag':
$term_ids = wp_get_post_terms( $post->ID, 'product_tag', array( 'fields' => 'ids' ) );
if ( $term_ids && ! is_wp_error( $term_ids ) ) {
$value = $term_ids;
}
break;
}
}
// Custom column
else {
$raw_value = $this->get_column_editability_value( $column, $post->ID );
if ( $raw_value === NULL ) {
continue;
}
$value = $raw_value;
}
/**
* Filter the raw value, used for editability, for a column
*
* @since 3.4
*
* @param mixed $value Column value used for editability
* @param CPAC_Column $column Colum object
* @param int $id Post ID to get the column editability for
* @param CACIE_Editable_Model $model Editability storage model
*/
$value = apply_filters( 'cac/editable/column_value', $value, $column, $post->ID, $this );
$value = apply_filters( 'cac/editable/column_value/column=' . $column->get_type(), $value, $column, $post->ID, $this );
// Get item data from Add-ons, like ACF or WC
$itemdata = array();
if ( method_exists( $column, 'get_item_data' ) ) {
$itemdata = $column->get_item_data( $post->ID );
}
// Add data
$columndata[ $column_name ] = array(
'revisions' => array( $value ),
'current_revision' => 0,
'itemdata' => $itemdata,
'editable' => array(
'formattedvalue' => $this->get_formatted_value( $column, $value )
)
);
}
// Add post to items list
$items[ $post->ID ] = array(
'ID' => $post->ID,
'columndata' => $columndata
);
}
return $items;
}
/**
* Get editability value for a column
*
* @since 3.4
*
* @param CPAC_Column $column Column
* @param integer $id Item ID
* @return mixed Raw value
*/
public function get_column_editability_value( $column, $id ) {
$raw_value = NULL;
if ( ! $column->properties->default ) {
$raw_value = $column->get_raw_value( $id );
}
switch( $column->properties->type ){
case 'column-wc-stock-status':
$product = get_product( $id );
if ( $product->is_type( 'variable', 'grouped', 'external' ) ) {
$raw_value = NULL;
}
break;
case 'order_status':
if ( substr( $raw_value, 0, 3 ) != 'wc-' ) {
$raw_value = 'wc-' . $raw_value;
}
break;
case '':
$raw_value = date( 'Ymd', strtotime( $column->get_raw_value( $id ) ) );
break;
}
return $raw_value;
}
/**
* Display terms
* Largerly taken from class-wp-post-list-table.php
*
* @since 1.0
*
* @param integer $id
* @param string $taxonomy
*/
private function display_terms( $id, $taxonomy ) {
if ( $terms = get_the_terms( $id, $taxonomy ) ) {
$out = array();
foreach ( $terms as $t ) {
$posts_in_term_qv = array(
'post_type' => 'post',
'taxonomy' => $taxonomy,
'term' => $t->slug
);
$out[] = sprintf( '<a href="%s">%s</a>',
esc_url( add_query_arg( $posts_in_term_qv, 'edit.php' ) ),
esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )
);
}
echo join( __( ', ' ), $out );
}
}
/**
* @see CACIE_Editable_Model::manage_value()
* @since 1.0
*/
public function manage_value( $column, $id ){
global $post;
$editable = $this->get_editable( $column->get_type() );
if ( ! empty( $editable['default_column'] ) ) {
echo $this->storage_model->get_original_column_value( $column->get_type(), $id );
}
else {
$post = get_post( $id );
setup_postdata( $post );
switch ( $column->properties->type ) {
case 'author':
printf(
'<a href="%s">%s</a>',
esc_url( add_query_arg( array(
'post_type' => $post->post_type,
'author' => get_the_author_meta( 'ID' )
), 'edit.php' ) ),
get_the_author()
);
break;
case 'categories':
$this->display_terms( $id, 'category' );
break;
case 'date':
case 'column-date_published':
// variables
global $post;
$post = get_post( $id );
$column_name = 'date';
$mode = '';
// source: class-wp-posts-list-table.php - line 622
// START
if ( '0000-00-00 00:00:00' == $post->post_date ) {
$t_time = $h_time = __( 'Unpublished' );
$time_diff = 0;
} else {
$t_time = get_the_time( __( 'Y/m/d g:i:s A' ) );
$m_time = $post->post_date;
$time = get_post_time( 'G', true, $post );
$time_diff = time() - $time;
if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS )
$h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
else
$h_time = mysql2date( __( 'Y/m/d' ), $m_time );
}
//echo '<td ' . $attributes . '>';
if ( 'excerpt' == $mode )
echo apply_filters( 'post_date_column_time', $t_time, $post, $column_name, $mode );
else
echo '<abbr title="' . $t_time . '">' . apply_filters( 'post_date_column_time', $h_time, $post, $column_name, $mode ) . '</abbr>';
echo '<br />';
if ( 'publish' == $post->post_status ) {
_e( 'Published' );
} elseif ( 'future' == $post->post_status ) {
if ( $time_diff > 0 )
echo '<strong class="attention">' . __( 'Missed schedule' ) . '</strong>';
else
_e( 'Scheduled' );
} else {
_e( 'Last Modified' );
}
//echo '</td>';
// END
break;
case 'tags':
$this->display_terms( $id, 'post_tag' );
break;
case 'title':
// @todo; currently is be set in DOM only by xeditable
// best option would be to give all of them a return value
// example: when using a post-status column you want to refresh
// the title column aswell as it contains the post status aswell.
// this can only be done if title has it's own manage_value.
break;
case 'product_cat':
$this->display_terms( $id, 'product_cat' );
break;
case 'product_tag':
$this->display_terms( $id, 'product_tag' );
break;
}
wp_reset_postdata();
}
}
/**
* @see CACIE_Editable_Model::column_save()
* @since 1.0
*/
public function column_save( $id, $column, $value ) {
global $wpdb;
if ( ! ( $post = get_post( $id ) ) ) {
exit;
}
if ( ! current_user_can( 'edit_post', $id ) ) {
exit;
}
// Third party columns can use the save() method as a callback for inline-editing
// If a column features a saving method itself, the "return" statement makes sure default behaviour is prevented
if ( method_exists( $column, 'save' ) ) {
$result = $column->save( $id, $value );
// Return a possible WP_Error yielded by the column save method
if ( is_wp_error( $result ) ) {
return $result;
}
return;
}
// Get editability data for the column to be saved
$editable = $this->get_editable( $column->properties->name );
switch ( $column->properties->type ) {
// Default
case 'categories':
$this->set_post_terms( $id, $value, 'category' );
break;
case 'date':
case 'column-date_published':
// preserve the original time
$time = strtotime("1970-01-01 " . date( 'H:i:s', strtotime( $post->post_date ) ) );
wp_update_post( array(
'ID' => $post->ID,
'edit_date' => 1, // needed for GMT date
'post_date' => date( 'Y-m-d H:i:s', strtotime( $value ) + $time )
));
break;
case 'tags':
$this->set_post_terms( $id, $value, 'post_tag' );
break;
// Custom columns
case 'column-attachment':
// detach
if ( $attachment_ids = get_posts( array( 'post_type' => 'attachment', 'post_parent' => $post->ID, 'posts_per_page' => -1, 'fields' => 'ids' ) ) ) {
foreach ( $attachment_ids as $attachment_id ) {
wp_update_post( array( 'ID' => $attachment_id, 'post_parent' => '' ) );
}
}
// attach
if ( ! empty( $value ) ) {
foreach ( $value as $attachment_id ) {
wp_update_post( array( 'ID' => $attachment_id, 'post_parent' => $post->ID ) );
}
}
break;
case 'column-featured_image':
case 'thumb': // woocommerce
if ( $value ) {
set_post_thumbnail( $post->ID, $value );
}
else {
delete_post_thumbnail( $post );
}
break;
case 'column-meta':
$this->update_meta( $post->ID, $column->get_field_key(), $value );
break;
case 'column-page_template':
update_post_meta( $post->ID, '_wp_page_template', $value );
break;
case 'column-post_formats':
set_post_format( $post->ID, $value );
break;
case 'column-sticky':
if ( 'yes' == $value ) {
stick_post( $post->ID );
}
else {
unstick_post( $post->ID );
}
break;
case 'column-taxonomy':
if ( ! empty( $column->options->taxonomy ) && taxonomy_exists( $column->options->taxonomy ) ) {
if ( 'post_format' == $column->options->taxonomy && ! empty( $value ) ) {
$value = $value[0];
}
$this->set_post_terms( $id, $value, $column->options->taxonomy );
}
break;
/**
* WooCommerce Columns
*
*/
case 'price':
if ( is_array( $value ) && isset( $value['regular_price'] ) && isset( $value['sale_price'] ) && isset( $value['sale_price_dates_from'] ) && isset( $value['sale_price_dates_to'] ) ) {
CACIE_WooCommerce::update_product_pricing( $post->ID, array(
'regular_price' => $value['regular_price'],
'sale_price' => $value['sale_price'],
'sale_price_dates_from' => $value['sale_price_dates_from'],
'sale_price_dates_to' => $value['sale_price_dates_to'],
) );
}
break;
case 'column-wc-weight':
$product = get_product( $post->ID );
if ( ! $product->is_virtual() ) {
update_post_meta( $post->ID, '_weight', ( $value === '' ) ? '' : wc_format_decimal( $value ) );
}
break;
case 'column-wc-dimensions':
if ( is_array( $value ) && isset( $value['length'] ) && isset( $value['width'] ) && isset( $value['height'] ) ) {
$product = get_product( $post->ID );
if ( ! $product->is_virtual() ) {
update_post_meta( $post->ID, '_length', ( $value === '' ) ? '' : wc_format_decimal( $value['length'] ) );
update_post_meta( $post->ID, '_width', ( $value === '' ) ? '' : wc_format_decimal( $value['width'] ) );
update_post_meta( $post->ID, '_height', ( $value === '' ) ? '' : wc_format_decimal( $value['height'] ) );
}
}
break;
case 'sku':
$product = get_product( $post->ID );
$current_sku = get_post_meta( $post->ID, '_sku', true );
$new_sku = wc_clean( $value );
if ( empty( $new_sku ) ) {
$new_sku = '';
}
if ( $new_sku != $current_sku ) {
$existing_id = $wpdb->get_var( $wpdb->prepare("
SELECT $wpdb->posts.ID
FROM $wpdb->posts
LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id)
WHERE $wpdb->posts.post_type = 'product'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->postmeta.meta_key = '_sku' AND $wpdb->postmeta.meta_value = %s
", $new_sku ) );
if ( $existing_id ) {
return new WP_Error( 'cacie_error_sku_exists', __( 'The SKU must be unique.', 'codepress-admin-columns' ) );
}
update_post_meta( $post->ID, '_sku', $new_sku );
}
break;
case 'is_in_stock':
if ( get_option( 'woocommerce_manage_stock' ) == 'yes' ) {
if ( $value['manage_stock'] == 'yes' ) {
update_post_meta( $post->ID, '_manage_stock', 'yes' );
wc_update_product_stock_status( $post->ID, wc_clean( $value['stock_status'] ) );
wc_update_product_stock( $post->ID, intval( $value['stock'] ) );
}
else {
// Don't manage stock
update_post_meta( $post->ID, '_manage_stock', 'no' );
update_post_meta( $post->ID, '_stock', '' );
wc_update_product_stock_status( $post->ID, wc_clean( $value['stock_status'] ) );
}
}
else {
wc_update_product_stock_status( $post->ID, wc_clean( $value['stock_status'] ) );
}
break;
case 'column-wc-stock-status':
wc_update_product_stock_status( $post->ID, wc_clean( $value ) );
break;
case 'column-wc-free_shipping':
update_post_meta( $id, 'free_shipping', ( $value == 'yes' ? 'yes' : 'no' ) );
break;
case 'column-wc-shipping_class':
$this->set_post_terms( $id, $value, 'product_shipping_class' );
break;
case 'column-wc-apply_before_tax':
update_post_meta( $id, 'apply_before_tax', ( $value == 'yes' ? 'yes' : 'no' ) );
break;
case 'column-wc-backorders_allowed':
if ( in_array( $value, array( 'no', 'yes', 'notify' ) ) ) {
update_post_meta( $post->ID, '_backorders', $value );
}
break;
case 'column-wc-upsells':
$upsell_ids = array();
if ( is_array( $value ) ) {
foreach ( $value as $upsell_id ) {
if ( $upsell_id && $upsell_id > 0 ) {
$upsell_ids[] = $upsell_id;
}
}
}
update_post_meta( $id, '_upsell_ids', $upsell_ids );
break;
case 'column-wc-crosssells':
$crosssell_ids = array();
if ( is_array( $value ) ) {
foreach ( $value as $crosssell_id ) {
if ( $crosssell_id && $crosssell_id > 0 ) {
$crosssell_ids[] = $crosssell_id;
}
}
}
update_post_meta( $id, '_crosssell_ids', $crosssell_ids );
break;
case 'column-wc-exclude_products':
$product_ids = array();
if ( is_array( $value ) ) {
foreach ( $value as $product_id ) {
if ( $product_id && $product_id > 0 ) {
$product_ids[] = $product_id;
}
}
}
update_post_meta( $id, 'exclude_product_ids', implode( ',', $product_ids ) );
break;
case 'column-wc-include_products':
$product_ids = array();
if ( is_array( $value ) ) {
foreach ( $value as $product_id ) {
if ( $product_id && $product_id > 0 ) {
$product_ids[] = $product_id;
}
}
}
update_post_meta( $id, 'product_ids', implode( ',', $product_ids ) );
break;
case 'column-wc-parent':
wp_update_post( array( 'ID' => $id, 'post_parent' => $value ) );
break;
case 'column-wc-minimum_amount':
update_post_meta( $id, 'minimum_amount', wc_format_decimal( $value ) );
break;
case 'order_status':
$order = new WC_Order( $id );
$order->update_status( $value );
break;
case 'usage':
update_post_meta( $id, 'usage_limit', wc_clean( $value['usage_limit'] ) );
update_post_meta( $id, 'usage_limit_per_user', wc_clean( $value['usage_limit_per_user'] ) );
break;
case 'amount':
update_post_meta( $id, 'coupon_amount', wc_format_decimal( $value ) );
break;
case 'type':
update_post_meta( $id, 'discount_type', wc_clean( $value ) );
break;
case 'product_cat':
$this->set_post_terms( $id, $value, 'product_cat' );
break;
case 'product_tag':
$this->set_post_terms( $id, $value, 'product_tag' );
break;
case 'column-wc-featured':
update_post_meta( $id, '_featured', $value );
break;
case 'column-wc-visibility':
update_post_meta( $id, '_visibility', $value );
break;
// Save basic property such as title or description (data that is available in WP_Post)
default:
if ( ! empty( $editable['property'] ) ) {
$property = $editable['property'];
if ( isset( $post->{$property} ) ) {
wp_update_post( array(
'ID' => $post->ID,
$property => $value
) );
}
}
else {
$result = null;
/**
* Called when a column is saved, but the saving is not handled by Admin Columns core
* This should be used for saving columns that are editable but do not have their own CPAC_Column class
* The first parameter, $result, should only be used if an error occurs
*
* @since 3.4
*
* @param WP_Error $result Result of saving
* @param CPAC_Column $column Column object
* @param int $id ID of item to be saved
* @param mixed $value Value to be saved
* @param CACIE_Editable_Model $model Editability storage model
*/
$result = apply_filters( 'cac/editable/column_save', $result, $column, $id, $value, $this );
$result = apply_filters( 'cac/editable/column_save/column=' . $column->get_type(), $result, $column, $id, $value, $this );
if ( is_wp_error( $result ) ) {
return $result;
}
}
}
}
}