change_featured_image_text(); // Uploads add_filter( 'upload_dir', array( $this, 'upload_dir' ) ); add_action( 'media_upload_downloadable_product', array( $this, 'media_upload_downloadable_product' ) ); if ( ! function_exists( 'duplicate_post_plugin_activation' ) ) { include( 'class-wc-admin-duplicate-product.php' ); } include_once( 'class-wc-admin-meta-boxes.php' ); // Download permissions add_action( 'woocommerce_process_product_file_download_paths', array( $this, 'process_product_file_download_paths' ), 10, 3 ); } /** * Define custom columns for products * @param array $existing_columns * @return array */ public function product_columns( $existing_columns ) { if ( empty( $existing_columns ) && ! is_array( $existing_columns ) ) { $existing_columns = array(); } unset( $existing_columns['title'], $existing_columns['comments'], $existing_columns['date'] ); $columns = array(); $columns['cb'] = ''; $columns['thumb'] = '' . __( 'Image', 'woocommerce' ) . ''; $columns['name'] = __( 'Name', 'woocommerce' ); if ( wc_product_sku_enabled() ) { $columns['sku'] = __( 'SKU', 'woocommerce' ); } if ( 'yes' == get_option( 'woocommerce_manage_stock' ) ) { $columns['is_in_stock'] = __( 'Stock', 'woocommerce' ); } $columns['price'] = __( 'Price', 'woocommerce' ); $columns['product_cat'] = __( 'Categories', 'woocommerce' ); $columns['product_tag'] = __( 'Tags', 'woocommerce' ); $columns['featured'] = '' . __( 'Featured', 'woocommerce' ) . ''; $columns['product_type'] = '' . __( 'Type', 'woocommerce' ) . ''; $columns['date'] = __( 'Date', 'woocommerce' ); return array_merge( $columns, $existing_columns ); } /** * Define custom columns for coupons * @param array $existing_columns * @return array */ public function shop_coupon_columns( $existing_columns ) { $columns = array(); $columns["cb"] = ""; $columns["coupon_code"] = __( 'Code', 'woocommerce' ); $columns["type"] = __( 'Coupon type', 'woocommerce' ); $columns["amount"] = __( 'Coupon amount', 'woocommerce' ); $columns["description"] = __( 'Description', 'woocommerce' ); $columns["products"] = __( 'Product IDs', 'woocommerce' ); $columns["usage"] = __( 'Usage / Limit', 'woocommerce' ); $columns["expiry_date"] = __( 'Expiry date', 'woocommerce' ); return $columns; } /** * Define custom columns for orders * @param array $existing_columns * @return array */ public function shop_order_columns( $existing_columns ) { $columns = array(); $columns['cb'] = ''; $columns['order_status'] = '' . esc_attr__( 'Status', 'woocommerce' ) . ''; $columns['order_title'] = __( 'Order', 'woocommerce' ); $columns['order_items'] = __( 'Purchased', 'woocommerce' ); $columns['shipping_address'] = __( 'Ship to', 'woocommerce' ); $columns['customer_message'] = '' . esc_attr__( 'Customer Message', 'woocommerce' ) . ''; $columns['order_notes'] = '' . esc_attr__( 'Order Notes', 'woocommerce' ) . ''; $columns['order_date'] = __( 'Date', 'woocommerce' ); $columns['order_total'] = __( 'Total', 'woocommerce' ); $columns['order_actions'] = __( 'Actions', 'woocommerce' ); return $columns; } /** * Ouput custom columns for products * @param string $column */ public function render_product_columns( $column ) { global $post; if ( empty( $the_product ) || $the_product->id != $post->ID ) { $the_product = wc_get_product( $post ); } switch ( $column ) { case 'thumb' : echo '' . $the_product->get_image( 'thumbnail' ) . ''; break; case 'name' : $edit_link = get_edit_post_link( $post->ID ); $title = _draft_or_post_title(); $post_type_object = get_post_type_object( $post->post_type ); $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $post->ID ); echo '' . $title.''; _post_states( $post ); echo ''; if ( $post->post_parent > 0 ) { echo '  ← '. get_the_title( $post->post_parent ) .''; } // Excerpt view if ( isset( $_GET['mode'] ) && 'excerpt' == $_GET['mode'] ) { echo apply_filters( 'the_excerpt', $post->post_excerpt ); } // Get actions $actions = array(); $actions['id'] = 'ID: ' . $post->ID; if ( $can_edit_post && 'trash' != $post->post_status ) { $actions['edit'] = '' . __( 'Edit', 'woocommerce' ) . ''; $actions['inline hide-if-no-js'] = '' . __( 'Quick Edit', 'woocommerce' ) . ''; } if ( current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) { if ( 'trash' == $post->post_status ) { $actions['untrash'] = '' . __( 'Restore', 'woocommerce' ) . ''; } elseif ( EMPTY_TRASH_DAYS ) { $actions['trash'] = '' . __( 'Trash', 'woocommerce' ) . ''; } if ( 'trash' == $post->post_status || ! EMPTY_TRASH_DAYS ) { $actions['delete'] = '' . __( 'Delete Permanently', 'woocommerce' ) . ''; } } if ( $post_type_object->public ) { if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) { if ( $can_edit_post ) $actions['view'] = '' . __( 'Preview', 'woocommerce' ) . ''; } elseif ( 'trash' != $post->post_status ) { $actions['view'] = '' . __( 'View', 'woocommerce' ) . ''; } } $actions = apply_filters( 'post_row_actions', $actions, $post ); echo '
'; $i = 0; $action_count = sizeof($actions); foreach ( $actions as $action => $link ) { ++$i; ( $i == $action_count ) ? $sep = '' : $sep = ' | '; echo '' . $link . $sep . ''; } echo '
'; get_inline_data( $post ); /* Custom inline data for woocommerce */ echo ' '; break; case 'sku' : echo $the_product->get_sku() ? $the_product->get_sku() : ''; break; case 'product_type' : if ( 'grouped' == $the_product->product_type ) { echo ''; } elseif ( 'external' == $the_product->product_type ) { echo ''; } elseif ( 'simple' == $the_product->product_type ) { if ( $the_product->is_virtual() ) { echo ''; } elseif ( $the_product->is_downloadable() ) { echo ''; } else { echo ''; } } elseif ( 'variable' == $the_product->product_type ) { echo ''; } else { // Assuming that we have other types in future echo ''; } break; case 'price' : echo $the_product->get_price_html() ? $the_product->get_price_html() : ''; break; case 'product_cat' : case 'product_tag' : if ( ! $terms = get_the_terms( $post->ID, $column ) ) { echo ''; } else { foreach ( $terms as $term ) { $termlist[] = '' . $term->name . ''; } echo implode( ', ', $termlist ); } break; case 'featured' : $url = wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_feature_product&product_id=' . $post->ID ), 'woocommerce-feature-product' ); echo ''; if ( $the_product->is_featured() ) { echo '' . __( 'Yes', 'woocommerce' ) . ''; } else { echo '' . __( 'No', 'woocommerce' ) . ''; } echo ''; break; case 'is_in_stock' : if ( $the_product->is_in_stock() ) { echo '' . __( 'In stock', 'woocommerce' ) . ''; } else { echo '' . __( 'Out of stock', 'woocommerce' ) . ''; } if ( $the_product->managing_stock() ) { echo ' × ' . $the_product->get_total_stock(); } break; default : break; } } /** * Output custom columns for coupons * @param string $column */ public function render_shop_coupon_columns( $column ) { global $post, $woocommerce; switch ( $column ) { case "coupon_code" : $edit_link = get_edit_post_link( $post->ID ); $title = _draft_or_post_title(); $post_type_object = get_post_type_object( $post->post_type ); $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $post->ID ); echo '' . esc_html( $title ). ''; _post_states( $post ); // Get actions $actions = array(); if ( current_user_can( $post_type_object->cap->edit_post, $post->ID ) ) { $actions['edit'] = '' . __( 'Edit', 'woocommerce' ) . ''; } if ( current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) { if ( 'trash' == $post->post_status ) $actions['untrash'] = "ID ) ), 'untrash-post_' . $post->ID ) . "'>" . __( 'Restore', 'woocommerce' ) . ""; elseif ( EMPTY_TRASH_DAYS ) $actions['trash'] = "" . __( 'Trash', 'woocommerce' ) . ""; if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS ) $actions['delete'] = "" . __( 'Delete Permanently', 'woocommerce' ) . ""; } $actions = apply_filters( 'post_row_actions', $actions, $post ); echo '
'; $i = 0; $action_count = sizeof($actions); foreach ( $actions as $action => $link ) { ++$i; ( $i == $action_count ) ? $sep = '' : $sep = ' | '; echo "$link$sep"; } echo '
'; break; case "type" : echo esc_html( wc_get_coupon_type( get_post_meta( $post->ID, 'discount_type', true ) ) ); break; case "amount" : echo esc_html( get_post_meta( $post->ID, 'coupon_amount', true ) ); break; case "products" : $product_ids = get_post_meta( $post->ID, 'product_ids', true ); $product_ids = $product_ids ? array_map( 'absint', explode( ',', $product_ids ) ) : array(); if ( sizeof( $product_ids ) > 0 ) echo esc_html( implode( ', ', $product_ids ) ); else echo '–'; break; case "usage_limit" : $usage_limit = get_post_meta( $post->ID, 'usage_limit', true ); if ( $usage_limit ) echo esc_html( $usage_limit ); else echo '–'; break; case "usage" : $usage_count = absint( get_post_meta( $post->ID, 'usage_count', true ) ); $usage_limit = esc_html( get_post_meta($post->ID, 'usage_limit', true) ); if ( $usage_limit ) printf( __( '%s / %s', 'woocommerce' ), $usage_count, $usage_limit ); else printf( __( '%s / ∞', 'woocommerce' ), $usage_count ); break; case "expiry_date" : $expiry_date = get_post_meta($post->ID, 'expiry_date', true); if ( $expiry_date ) echo esc_html( date_i18n( 'F j, Y', strtotime( $expiry_date ) ) ); else echo '–'; break; case "description" : echo wp_kses_post( $post->post_excerpt ); break; } } /** * Output custom columns for coupons * @param string $column */ public function render_shop_order_columns( $column ) { global $post, $woocommerce, $the_order; if ( empty( $the_order ) || $the_order->id != $post->ID ) { $the_order = wc_get_order( $post->ID ); } switch ( $column ) { case 'order_status' : printf( '%s', sanitize_title( $the_order->get_status() ), wc_get_order_status_name( $the_order->get_status() ), wc_get_order_status_name( $the_order->get_status() ) ); break; case 'order_date' : if ( '0000-00-00 00:00:00' == $post->post_date ) { $t_time = $h_time = __( 'Unpublished', 'woocommerce' ); } else { $t_time = get_the_time( __( 'Y/m/d g:i:s A', 'woocommerce' ), $post ); $gmt_time = strtotime( $post->post_date_gmt . ' UTC' ); $time_diff = current_time( 'timestamp', 1 ) - $gmt_time; $h_time = get_the_time( __( 'Y/m/d', 'woocommerce' ), $post ); } echo '' . esc_html( apply_filters( 'post_date_column_time', $h_time, $post ) ) . ''; break; case 'customer_message' : if ( $the_order->customer_message ) echo '' . __( 'Yes', 'woocommerce' ) . ''; else echo ''; break; case 'order_items' : echo '' . apply_filters( 'woocommerce_admin_order_item_count', sprintf( _n( '%d item', '%d items', $the_order->get_item_count(), 'woocommerce' ), $the_order->get_item_count() ), $the_order ) . ''; if ( sizeof( $the_order->get_items() ) > 0 ) { echo ''; foreach ( $the_order->get_items() as $item ) { $_product = apply_filters( 'woocommerce_order_item_product', $the_order->get_product_from_item( $item ), $item ); $item_meta = new WC_Order_Item_Meta( $item['item_meta'] ); $item_meta_html = $item_meta->display( true, true ); ?> '; } else echo '–'; break; case 'shipping_address' : if ( $the_order->get_formatted_shipping_address() ) echo ''. esc_html( preg_replace( '##i', ', ', $the_order->get_formatted_shipping_address() ) ) .''; else echo '–'; if ( $the_order->get_shipping_method() ) echo '' . __( 'Via', 'woocommerce' ) . ' ' . esc_html( $the_order->get_shipping_method() ) . ''; break; case 'order_notes' : if ( $post->comment_count ) { // check the status of the post ( $post->post_status !== 'trash' ) ? $status = '' : $status = 'post-trashed'; $latest_notes = get_comments( array( 'post_id' => $post->ID, 'number' => 1, 'status' => $status ) ); $latest_note = current( $latest_notes ); if ( $post->comment_count == 1 ) { echo '' . __( 'Yes', 'woocommerce' ) . ''; } else { $note_tip = isset( $latest_note->comment_content ) ? esc_attr( $latest_note->comment_content . '' . sprintf( _n( 'plus %d other note', 'plus %d other notes', ( $post->comment_count - 1 ), 'woocommerce' ), ( $post->comment_count - 1 ) ) . '' ) : sprintf( _n( '%d note', '%d notes', $post->comment_count, 'woocommerce' ), $post->comment_count ); echo '' . __( 'Yes', 'woocommerce' ) . ''; } } else { echo ''; } break; case 'order_total' : echo esc_html( strip_tags( $the_order->get_formatted_order_total() ) ); if ( $the_order->payment_method_title ) { echo '' . __( 'Via', 'woocommerce' ) . ' ' . esc_html( $the_order->payment_method_title ) . ''; } break; case 'order_title' : $customer_tip = ''; if ( $address = $the_order->get_formatted_billing_address() ) { $customer_tip .= __( 'Billing:', 'woocommerce' ) . ' ' . $address . '

'; } if ( $the_order->billing_phone ) { $customer_tip .= __( 'Tel:', 'woocommerce' ) . ' ' . $the_order->billing_phone; } echo '
'; if ( $the_order->user_id ) { $user_info = get_userdata( $the_order->user_id ); } if ( ! empty( $user_info ) ) { $username = ''; if ( $user_info->first_name || $user_info->last_name ) { $username .= esc_html( ucfirst( $user_info->first_name ) . ' ' . ucfirst( $user_info->last_name ) ); } else { $username .= esc_html( ucfirst( $user_info->display_name ) ); } $username .= ''; } else { if ( $the_order->billing_first_name || $the_order->billing_last_name ) { $username = trim( $the_order->billing_first_name . ' ' . $the_order->billing_last_name ); } else { $username = __( 'Guest', 'woocommerce' ); } } printf( __( '%s by %s', 'woocommerce' ), '' . esc_attr( $the_order->get_order_number() ) . '', $username ); if ( $the_order->billing_email ) { echo '' . esc_html( $the_order->billing_email ) . ''; } echo '
'; break; case 'order_actions' : ?>

has_status( array( 'pending', 'on-hold' ) ) ) { $actions['processing'] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_processing&order_id=' . $post->ID ), 'woocommerce-mark-order-processing' ), 'name' => __( 'Processing', 'woocommerce' ), 'action' => "processing" ); } if ( $the_order->has_status( array( 'pending', 'on-hold', 'processing' ) ) ) { $actions['complete'] = array( 'url' => wp_nonce_url( admin_url( 'admin-ajax.php?action=woocommerce_mark_order_complete&order_id=' . $post->ID ), 'woocommerce-mark-order-complete' ), 'name' => __( 'Complete', 'woocommerce' ), 'action' => "complete" ); } $actions['view'] = array( 'url' => admin_url( 'post.php?post=' . $post->ID . '&action=edit' ), 'name' => __( 'View', 'woocommerce' ), 'action' => "view" ); $actions = apply_filters( 'woocommerce_admin_order_actions', $actions, $the_order ); foreach ( $actions as $action ) { printf( '%s', esc_attr( $action['action'] ), esc_url( $action['url'] ), esc_attr( $action['name'] ), esc_attr( $action['name'] ) ); } do_action( 'woocommerce_admin_order_actions_end', $the_order ); ?>

'price', 'featured' => 'featured', 'sku' => 'sku', 'name' => 'title' ); return wp_parse_args( $custom, $columns ); } /** * Make columns sortable - https://gist.github.com/906872 * * @param array $columns * @return array */ public function shop_coupon_sortable_columns( $columns ) { return $columns; } /** * Make columns sortable - https://gist.github.com/906872 * * @param array $columns * @return array */ public function shop_order_sortable_columns( $columns ) { $custom = array( 'order_title' => 'ID', 'order_total' => 'order_total', 'order_date' => 'date' ); unset( $columns['comments'] ); return wp_parse_args( $custom, $columns ); } /** * Remove edit from the bulk actions. * * @param array $actions * @return array */ public function shop_order_bulk_actions( $actions ) { if ( isset( $actions['edit'] ) ) { unset( $actions['edit'] ); } return $actions; } /** * Product sorting link * * Based on Simple Page Ordering by 10up (http://wordpress.org/extend/plugins/simple-page-ordering/) * * @param array $views * @return array */ public function product_sorting_link( $views ) { global $post_type, $wp_query; if ( ! current_user_can('edit_others_pages') ) { return $views; } $class = ( isset( $wp_query->query['orderby'] ) && $wp_query->query['orderby'] == 'menu_order title' ) ? 'current' : ''; $query_string = remove_query_arg(array( 'orderby', 'order' )); $query_string = add_query_arg( 'orderby', urlencode('menu_order title'), $query_string ); $query_string = add_query_arg( 'order', urlencode('ASC'), $query_string ); $views['byorder'] = '' . __( 'Sort Products', 'woocommerce' ) . ''; return $views; } /** * Custom bulk edit - form * * @access public * @param mixed $column_name * @param mixed $post_type */ public function bulk_edit( $column_name, $post_type ) { if ( 'price' != $column_name || 'product' != $post_type ) { return; } include( WC()->plugin_path() . '/includes/admin/views/html-bulk-edit-product.php' ); } /** * Custom quick edit - form * * @access public * @param mixed $column_name * @param mixed $post_type */ public function quick_edit( $column_name, $post_type ) { if ( 'price' != $column_name || 'product' != $post_type ) { return; } include( WC()->plugin_path() . '/includes/admin/views/html-quick-edit-product.php' ); } /** * Quick and bulk edit saving * * @access public * @param int $post_id * @param WP_Post $post * @return int */ public function bulk_and_quick_edit_save_post( $post_id, $post ) { // If this is an autosave, our form has not been submitted, so we don't want to do anything. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return $post_id; } // Don't save revisions and autosaves if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) { return $post_id; } // Check post type is product if ( 'product' != $post->post_type ) { return $post_id; } // Check user permission if ( ! current_user_can( 'edit_post', $post_id ) ) { return $post_id; } // Check nonces if ( ! isset( $_REQUEST['woocommerce_quick_edit_nonce'] ) && ! isset( $_REQUEST['woocommerce_bulk_edit_nonce'] ) ) { return $post_id; } if ( isset( $_REQUEST['woocommerce_quick_edit_nonce'] ) && ! wp_verify_nonce( $_REQUEST['woocommerce_quick_edit_nonce'], 'woocommerce_quick_edit_nonce' ) ) { return $post_id; } if ( isset( $_REQUEST['woocommerce_bulk_edit_nonce'] ) && ! wp_verify_nonce( $_REQUEST['woocommerce_bulk_edit_nonce'], 'woocommerce_bulk_edit_nonce' ) ) { return $post_id; } // Get the product and save $product = wc_get_product( $post ); if ( ! empty( $_REQUEST['woocommerce_quick_edit'] ) ) { $this->quick_edit_save( $post_id, $product ); } else { $this->bulk_edit_save( $post_id, $product ); } // Clear transient wc_delete_product_transients( $post_id ); return $post_id; } /** * Quick edit * @param integer $post_id */ private function quick_edit_save( $post_id, $product ) { global $wpdb; $old_regular_price = $product->regular_price; $old_sale_price = $product->sale_price; // Save fields if ( isset( $_REQUEST['_sku'] ) ) { $sku = get_post_meta( $post_id, '_sku', true ); $new_sku = wc_clean( stripslashes( $_REQUEST['_sku'] ) ); if ( $new_sku !== $sku ) { if ( ! empty( $new_sku ) ) { $unique_sku = wc_product_has_unique_sku( $post_id, $new_sku ); if ( $unique_sku ) { update_post_meta( $post_id, '_sku', $new_sku ); } } else { update_post_meta( $post_id, '_sku', '' ); } } } if ( isset( $_REQUEST['_weight'] ) ) { update_post_meta( $post_id, '_weight', wc_clean( $_REQUEST['_weight'] ) ); } if ( isset( $_REQUEST['_length'] ) ) { update_post_meta( $post_id, '_length', wc_clean( $_REQUEST['_length'] ) ); } if ( isset( $_REQUEST['_width'] ) ) { update_post_meta( $post_id, '_width', wc_clean( $_REQUEST['_width'] ) ); } if ( isset( $_REQUEST['_height'] ) ) { update_post_meta( $post_id, '_height', wc_clean( $_REQUEST['_height'] ) ); } if ( isset( $_REQUEST['_visibility'] ) ) { if ( update_post_meta( $post_id, '_visibility', wc_clean( $_REQUEST['_visibility'] ) ) ) { do_action( 'woocommerce_product_set_visibility', $post_id, wc_clean( $_REQUEST['_visibility'] ) ); } } if ( isset( $_REQUEST['_featured'] ) ) { if ( update_post_meta( $post_id, '_featured', 'yes' ) ) { delete_transient( 'wc_featured_products' ); } } else { if ( update_post_meta( $post_id, '_featured', 'no' ) ) { delete_transient( 'wc_featured_products' ); } } if ( isset( $_REQUEST['_tax_status'] ) ) { update_post_meta( $post_id, '_tax_status', wc_clean( $_REQUEST['_tax_status'] ) ); } if ( isset( $_REQUEST['_tax_class'] ) ) { update_post_meta( $post_id, '_tax_class', wc_clean( $_REQUEST['_tax_class'] ) ); } if ( $product->is_type('simple') || $product->is_type('external') ) { if ( isset( $_REQUEST['_regular_price'] ) ) { $new_regular_price = $_REQUEST['_regular_price'] === '' ? '' : wc_format_decimal( $_REQUEST['_regular_price'] ); update_post_meta( $post_id, '_regular_price', $new_regular_price ); } else { $new_regular_price = null; } if ( isset( $_REQUEST['_sale_price'] ) ) { $new_sale_price = $_REQUEST['_sale_price'] === '' ? '' : wc_format_decimal( $_REQUEST['_sale_price'] ); update_post_meta( $post_id, '_sale_price', $new_sale_price ); } else { $new_sale_price = null; } // Handle price - remove dates and set to lowest $price_changed = false; if ( ! is_null( $new_regular_price ) && $new_regular_price != $old_regular_price ) { $price_changed = true; } elseif ( ! is_null( $new_sale_price ) && $new_sale_price != $old_sale_price ) { $price_changed = true; } if ( $price_changed ) { update_post_meta( $post_id, '_sale_price_dates_from', '' ); update_post_meta( $post_id, '_sale_price_dates_to', '' ); if ( ! is_null( $new_sale_price ) && $new_sale_price !== '' ) { update_post_meta( $post_id, '_price', $new_sale_price ); } else { update_post_meta( $post_id, '_price', $new_regular_price ); } } } // Handle stock status if ( isset( $_REQUEST['_stock_status'] ) ) { wc_update_product_stock_status( $post_id, wc_clean( $_REQUEST['_stock_status'] ) ); } // Handle stock if ( ! $product->is_type('grouped') ) { if ( isset( $_REQUEST['_manage_stock'] ) ) { update_post_meta( $post_id, '_manage_stock', 'yes' ); wc_update_product_stock( $post_id, wc_stock_amount( $_REQUEST['_stock'] ) ); } else { update_post_meta( $post_id, '_manage_stock', 'no' ); wc_update_product_stock( $post_id, 0 ); } if ( ! empty( $_REQUEST['_backorders'] ) ) { update_post_meta( $post_id, '_backorders', wc_clean( $_REQUEST['_backorders'] ) ); } } do_action( 'woocommerce_product_quick_edit_save', $product ); } /** * Bulk edit * @param integer $post_id */ public function bulk_edit_save( $post_id, $product ) { $old_regular_price = $product->regular_price; $old_sale_price = $product->sale_price; // Save fields if ( ! empty( $_REQUEST['change_weight'] ) && isset( $_REQUEST['_weight'] ) ) { update_post_meta( $post_id, '_weight', wc_clean( stripslashes( $_REQUEST['_weight'] ) ) ); } if ( ! empty( $_REQUEST['change_dimensions'] ) ) { if ( isset( $_REQUEST['_length'] ) ) { update_post_meta( $post_id, '_length', wc_clean( stripslashes( $_REQUEST['_length'] ) ) ); } if ( isset( $_REQUEST['_width'] ) ) { update_post_meta( $post_id, '_width', wc_clean( stripslashes( $_REQUEST['_width'] ) ) ); } if ( isset( $_REQUEST['_height'] ) ) { update_post_meta( $post_id, '_height', wc_clean( stripslashes( $_REQUEST['_height'] ) ) ); } } if ( ! empty( $_REQUEST['_tax_status'] ) ) { update_post_meta( $post_id, '_tax_status', wc_clean( $_REQUEST['_tax_status'] ) ); } if ( ! empty( $_REQUEST['_tax_class'] ) ) { $tax_class = wc_clean( $_REQUEST['_tax_class'] ); if ( 'standard' == $tax_class ) { $tax_class = ''; } update_post_meta( $post_id, '_tax_class', $tax_class ); } if ( ! empty( $_REQUEST['_stock_status'] ) ) { wc_update_product_stock_status( $post_id, wc_clean( $_REQUEST['_stock_status'] ) ); } if ( ! empty( $_REQUEST['_visibility'] ) ) { if ( update_post_meta( $post_id, '_visibility', wc_clean( $_REQUEST['_visibility'] ) ) ) { do_action( 'woocommerce_product_set_visibility', $post_id, wc_clean( $_REQUEST['_visibility'] ) ); } } if ( ! empty( $_REQUEST['_featured'] ) ) { if ( update_post_meta( $post_id, '_featured', stripslashes( $_REQUEST['_featured'] ) ) ) { delete_transient( 'wc_featured_products' ); } } // Sold Individually if ( ! empty( $_REQUEST['_sold_individually'] ) ) { if ( $_REQUEST['_sold_individually'] == 'yes' ) { update_post_meta( $post_id, '_sold_individually', 'yes' ); } else { update_post_meta( $post_id, '_sold_individually', '' ); } } // Handle price - remove dates and set to lowest if ( $product->is_type( 'simple' ) || $product->is_type( 'external' ) ) { $price_changed = false; if ( ! empty( $_REQUEST['change_regular_price'] ) ) { $change_regular_price = absint( $_REQUEST['change_regular_price'] ); $regular_price = esc_attr( stripslashes( $_REQUEST['_regular_price'] ) ); switch ( $change_regular_price ) { case 1 : $new_price = $regular_price; break; case 2 : if ( strstr( $regular_price, '%' ) ) { $percent = str_replace( '%', '', $regular_price ) / 100; $new_price = $old_regular_price + ( round( $old_regular_price * $percent, absint( get_option( 'woocommerce_price_num_decimals' ) ) ) ); } else { $new_price = $old_regular_price + $regular_price; } break; case 3 : if ( strstr( $regular_price, '%' ) ) { $percent = str_replace( '%', '', $regular_price ) / 100; $new_price = max( 0, $old_regular_price - ( round ( $old_regular_price * $percent, absint( get_option( 'woocommerce_price_num_decimals' ) ) ) ) ); } else { $new_price = max( 0, $old_regular_price - $regular_price ); } break; default : break; } if ( isset( $new_price ) && $new_price != $old_regular_price ) { $price_changed = true; $new_price = round( $new_price, absint( get_option( 'woocommerce_price_num_decimals' ) ) ); update_post_meta( $post_id, '_regular_price', $new_price ); $product->regular_price = $new_price; } } if ( ! empty( $_REQUEST['change_sale_price'] ) ) { $change_sale_price = absint( $_REQUEST['change_sale_price'] ); $sale_price = esc_attr( stripslashes( $_REQUEST['_sale_price'] ) ); switch ( $change_sale_price ) { case 1 : $new_price = $sale_price; break; case 2 : if ( strstr( $sale_price, '%' ) ) { $percent = str_replace( '%', '', $sale_price ) / 100; $new_price = $old_sale_price + ( $old_sale_price * $percent ); } else { $new_price = $old_sale_price + $sale_price; } break; case 3 : if ( strstr( $sale_price, '%' ) ) { $percent = str_replace( '%', '', $sale_price ) / 100; $new_price = max( 0, $old_sale_price - ( $old_sale_price * $percent ) ); } else { $new_price = max( 0, $old_sale_price - $sale_price ); } break; case 4 : if ( strstr( $sale_price, '%' ) ) { $percent = str_replace( '%', '', $sale_price ) / 100; $new_price = max( 0, $product->regular_price - ( $product->regular_price * $percent ) ); } else { $new_price = max( 0, $product->regular_price - $sale_price ); } break; default : break; } if ( isset( $new_price ) && $new_price != $old_sale_price ) { $price_changed = true; $new_price = round( $new_price, absint( get_option( 'woocommerce_price_num_decimals' ) ) ); update_post_meta( $post_id, '_sale_price', $new_price ); $product->sale_price = $new_price; } } if ( $price_changed ) { update_post_meta( $post_id, '_sale_price_dates_from', '' ); update_post_meta( $post_id, '_sale_price_dates_to', '' ); if ( $product->regular_price < $product->sale_price ) { $product->sale_price = ''; update_post_meta( $post_id, '_sale_price', '' ); } if ( $product->sale_price ) { update_post_meta( $post_id, '_price', $product->sale_price ); } else { update_post_meta( $post_id, '_price', $product->regular_price ); } } } // Handle stock if ( ! $product->is_type( 'grouped' ) ) { if ( ! empty( $_REQUEST['change_stock'] ) ) { update_post_meta( $post_id, '_manage_stock', 'yes' ); wc_update_product_stock( $post_id, wc_stock_amount( $_REQUEST['_stock'] ) ); } if ( ! empty( $_REQUEST['_manage_stock'] ) ) { if ( $_REQUEST['_manage_stock'] == 'yes' ) { update_post_meta( $post_id, '_manage_stock', 'yes' ); } else { update_post_meta( $post_id, '_manage_stock', 'no' ); wc_update_product_stock( $post_id, 0 ); } } if ( ! empty( $_REQUEST['_backorders'] ) ) { update_post_meta( $post_id, '_backorders', wc_clean( $_REQUEST['_backorders'] ) ); } } do_action( 'woocommerce_product_bulk_edit_save', $product ); } /** * Add extra bulk action options to mark orders as complete or processing * * Using Javascript until WordPress core fixes: http://core.trac.wordpress.org/ticket/16031 * * @access public * @return void */ public function bulk_admin_footer() { global $post_type; if ( 'shop_order' == $post_type ) { ?> current_action(); switch ( $action ) { case 'mark_completed': $new_status = 'completed'; $report_action = 'marked_complete'; break; case 'mark_processing': $new_status = 'processing'; $report_action = 'marked_processing'; break; case 'mark_on-hold' : $new_status = 'on-hold'; $report_action = 'marked_on-hold'; break; break; default: return; } $changed = 0; $post_ids = array_map( 'absint', (array) $_REQUEST['post'] ); foreach ( $post_ids as $post_id ) { $order = wc_get_order( $post_id ); $order->update_status( $new_status, __( 'Order status changed by bulk edit:', 'woocommerce' ) ); $changed++; } $sendback = add_query_arg( array( 'post_type' => 'shop_order', $report_action => true, 'changed' => $changed, 'ids' => join( ',', $post_ids ) ), '' ); wp_redirect( $sendback ); exit(); } /** * Show confirmation message that order status changed for number of orders * * @access public * @return void */ public function bulk_admin_notices() { global $post_type, $pagenow; if ( isset( $_REQUEST['marked_complete'] ) || isset( $_REQUEST['marked_processing'] ) || isset( $_REQUEST['marked_on-hold'] ) ) { $number = isset( $_REQUEST['changed'] ) ? absint( $_REQUEST['changed'] ) : 0; if ( 'edit.php' == $pagenow && 'shop_order' == $post_type ) { $message = sprintf( _n( 'Order status changed.', '%s order statuses changed.', $number, 'woocommerce' ), number_format_i18n( $number ) ); echo '

' . $message . '

'; } } } /** * Search custom fields as well as content. * * @access public * @param WP_Query $wp * @return void */ public function shop_order_search_custom_fields( $wp ) { global $pagenow, $wpdb; if ( 'edit.php' != $pagenow || empty( $wp->query_vars['s'] ) || $wp->query_vars['post_type'] != 'shop_order' ) { return; } $search_fields = array_map( 'wc_clean', apply_filters( 'woocommerce_shop_order_search_fields', array( '_order_key', '_billing_company', '_billing_address_1', '_billing_address_2', '_billing_city', '_billing_postcode', '_billing_country', '_billing_state', '_billing_email', '_billing_phone', '_shipping_address_1', '_shipping_address_2', '_shipping_city', '_shipping_postcode', '_shipping_country', '_shipping_state' ) ) ); $search_order_id = str_replace( 'Order #', '', $_GET['s'] ); if ( ! is_numeric( $search_order_id ) ) { $search_order_id = 0; } // Search orders $post_ids = array_unique( array_merge( $wpdb->get_col( $wpdb->prepare( " SELECT p1.post_id FROM {$wpdb->postmeta} p1 INNER JOIN {$wpdb->postmeta} p2 ON p1.post_id = p2.post_id WHERE ( p1.meta_key = '_billing_first_name' AND p2.meta_key = '_billing_last_name' AND CONCAT(p1.meta_value, ' ', p2.meta_value) LIKE '%%%s%%' ) OR ( p1.meta_key = '_shipping_first_name' AND p2.meta_key = '_shipping_last_name' AND CONCAT(p1.meta_value, ' ', p2.meta_value) LIKE '%%%s%%' ) OR ( p1.meta_key IN ('" . implode( "','", $search_fields ) . "') AND p1.meta_value LIKE '%%%s%%' ) ", esc_attr( $_GET['s'] ), esc_attr( $_GET['s'] ), esc_attr( $_GET['s'] ) ) ), $wpdb->get_col( $wpdb->prepare( " SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items as order_items WHERE order_item_name LIKE '%%%s%%' ", esc_attr( $_GET['s'] ) ) ), array( $search_order_id ) ) ); // Remove s - we don't want to search order name unset( $wp->query_vars['s'] ); // so we know we're doing this $wp->query_vars['shop_order_search'] = true; // Search by found posts $wp->query_vars['post__in'] = $post_ids; } /** * Change the label when searching orders. * * @access public * @param mixed $query * @return string */ public function shop_order_search_label( $query ) { global $pagenow, $typenow; if ( 'edit.php' != $pagenow ) { return $query; } if ( $typenow != 'shop_order' ) { return $query; } if ( ! get_query_var( 'shop_order_search' ) ) { return $query; } return wp_unslash( $_GET['s'] ); } /** * Query vars for custom searches. * * @access public * @param mixed $public_query_vars * @return array */ public function add_custom_query_var( $public_query_vars ) { $public_query_vars[] = 'sku'; $public_query_vars[] = 'shop_order_search'; return $public_query_vars; } /** * Filters for post types */ public function restrict_manage_posts() { global $typenow, $wp_query; switch ( $typenow ) { case 'product' : $this->product_filters(); break; case 'shop_coupon' : $this->shop_coupon_filters(); break; case 'shop_order' : $this->shop_order_filters(); break; default : break; } } /** * Show a category filter box */ public function product_filters() { global $wp_query; // Category Filtering wc_product_dropdown_categories(); // Type filtering $terms = get_terms( 'product_type' ); $output = ''; echo apply_filters( 'woocommerce_product_filters', $output ); } /** * Show custom filters to filter coupons by type. */ public function shop_coupon_filters() { ?> '_price', 'orderby' => 'meta_value_num' ) ); } if ( 'featured' == $vars['orderby'] ) { $vars = array_merge( $vars, array( 'meta_key' => '_featured', 'orderby' => 'meta_value' ) ); } if ( 'sku' == $vars['orderby'] ) { $vars = array_merge( $vars, array( 'meta_key' => '_sku', 'orderby' => 'meta_value' ) ); } } } elseif ( 'shop_coupon' === $typenow ) { if ( ! empty( $_GET['coupon_type'] ) ) { $vars['meta_key'] = 'discount_type'; $vars['meta_value'] = wc_clean( $_GET['coupon_type'] ); } } elseif ( 'shop_order' === $typenow ) { // Filter the orders by the posted customer. if ( isset( $_GET['_customer_user'] ) && $_GET['_customer_user'] > 0 ) { $vars['meta_key'] = '_customer_user'; $vars['meta_value'] = (int) $_GET['_customer_user']; } // Sorting if ( isset( $vars['orderby'] ) ) { if ( 'order_total' == $vars['orderby'] ) { $vars = array_merge( $vars, array( 'meta_key' => '_order_total', 'orderby' => 'meta_value_num' ) ); } } // Status if ( ! isset( $vars['post_status'] ) ) { $vars['post_status'] = array_keys( wc_get_order_statuses() ); } } return $vars; } /** * Filter the products in admin based on options * * @param mixed $query */ public function product_filters_query( $query ) { global $typenow, $wp_query; if ( 'product' == $typenow ) { if ( isset( $query->query_vars['product_type'] ) ) { // Subtypes if ( 'downloadable' == $query->query_vars['product_type'] ) { $query->query_vars['product_type'] = ''; $query->query_vars['meta_value'] = 'yes'; $query->query_vars['meta_key'] = '_downloadable'; } elseif ( 'virtual' == $query->query_vars['product_type'] ) { $query->query_vars['product_type'] = ''; $query->query_vars['meta_value'] = 'yes'; $query->query_vars['meta_key'] = '_virtual'; } } // Categories if ( isset( $_GET['product_cat'] ) && '0' == $_GET['product_cat'] ) { $query->query_vars['tax_query'][] = array( 'taxonomy' => 'product_cat', 'field' => 'id', 'terms' => get_terms( 'product_cat', array( 'fields' => 'ids' ) ), 'operator' => 'NOT IN' ); } } } /** * Search by SKU or ID for products. * @param string $where * @return string */ public function product_search( $where ) { global $pagenow, $wpdb, $wp; if ( 'edit.php' != $pagenow || ! is_search() || ! isset( $wp->query_vars['s'] ) || 'product' != $wp->query_vars['post_type'] ) { return $where; } $search_ids = array(); $terms = explode( ',', $wp->query_vars['s'] ); foreach ( $terms as $term ) { if ( is_numeric( $term ) ) { $search_ids[] = $term; } // Attempt to get a SKU $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value LIKE '%%%s%%';", wc_clean( $term ) ) ); if ( $sku_to_id && sizeof( $sku_to_id ) > 0 ) { $search_ids = array_merge( $search_ids, $sku_to_id ); } } $search_ids = array_filter( array_map( 'absint', $search_ids ) ); if ( sizeof( $search_ids ) > 0 ) { $where = str_replace( ')))', ") OR ({$wpdb->posts}.ID IN (" . implode( ',', $search_ids ) . "))))", $where ); } return $where; } /** * Change messages when a post type is updated. * * @param array $messages * @return array */ public function post_updated_messages( $messages ) { global $post, $post_ID; $messages['product'] = array( 0 => '', // Unused. Messages start at index 1. 1 => sprintf( __( 'Product updated. View Product', 'woocommerce' ), esc_url( get_permalink($post_ID) ) ), 2 => __( 'Custom field updated.', 'woocommerce' ), 3 => __( 'Custom field deleted.', 'woocommerce' ), 4 => __( 'Product updated.', 'woocommerce' ), 5 => isset($_GET['revision']) ? sprintf( __( 'Product restored to revision from %s', 'woocommerce' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => sprintf( __( 'Product published. View Product', 'woocommerce' ), esc_url( get_permalink($post_ID) ) ), 7 => __( 'Product saved.', 'woocommerce' ), 8 => sprintf( __( 'Product submitted. Preview Product', 'woocommerce' ), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 9 => sprintf( __( 'Product scheduled for: %1$s. Preview Product', 'woocommerce' ), date_i18n( __( 'M j, Y @ G:i', 'woocommerce' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 10 => sprintf( __( 'Product draft updated. Preview Product', 'woocommerce' ), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), ); $messages['shop_order'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __( 'Order updated.', 'woocommerce' ), 2 => __( 'Custom field updated.', 'woocommerce' ), 3 => __( 'Custom field deleted.', 'woocommerce' ), 4 => __( 'Order updated.', 'woocommerce' ), 5 => isset($_GET['revision']) ? sprintf( __( 'Order restored to revision from %s', 'woocommerce' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __( 'Order updated.', 'woocommerce' ), 7 => __( 'Order saved.', 'woocommerce' ), 8 => __( 'Order submitted.', 'woocommerce' ), 9 => sprintf( __( 'Order scheduled for: %1$s.', 'woocommerce' ), date_i18n( __( 'M j, Y @ G:i', 'woocommerce' ), strtotime( $post->post_date ) ) ), 10 => __( 'Order draft updated.', 'woocommerce' ) ); $messages['shop_coupon'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __( 'Coupon updated.', 'woocommerce' ), 2 => __( 'Custom field updated.', 'woocommerce' ), 3 => __( 'Custom field deleted.', 'woocommerce' ), 4 => __( 'Coupon updated.', 'woocommerce' ), 5 => isset($_GET['revision']) ? sprintf( __( 'Coupon restored to revision from %s', 'woocommerce' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __( 'Coupon updated.', 'woocommerce' ), 7 => __( 'Coupon saved.', 'woocommerce' ), 8 => __( 'Coupon submitted.', 'woocommerce' ), 9 => sprintf( __( 'Coupon scheduled for: %1$s.', 'woocommerce' ), date_i18n( __( 'M j, Y @ G:i', 'woocommerce' ), strtotime( $post->post_date ) ) ), 10 => __( 'Coupon draft updated.', 'woocommerce' ) ); return $messages; } /** * Disable the auto-save functionality for Orders. * * @access public * @return void */ public function disable_autosave(){ global $post; if ( $post && in_array( get_post_type( $post->ID ), wc_get_order_types( 'order-meta-boxes' ) ) ) { wp_dequeue_script( 'autosave' ); } } /** * Removes variations etc belonging to a deleted post, and clears transients * * @access public * @param mixed $id ID of post being deleted * @return void */ public function delete_post( $id ) { global $woocommerce, $wpdb; if ( ! current_user_can( 'delete_posts' ) ) return; if ( $id > 0 ) { $post_type = get_post_type( $id ); switch( $post_type ) { case 'product' : $child_product_variations = get_children( 'post_parent=' . $id . '&post_type=product_variation' ); if ( $child_product_variations ) { foreach ( $child_product_variations as $child ) { wp_delete_post( $child->ID, true ); } } $child_products = get_children( 'post_parent=' . $id . '&post_type=product' ); if ( $child_products ) { foreach ( $child_products as $child ) { $child_post = array(); $child_post['ID'] = $child->ID; $child_post['post_parent'] = 0; wp_update_post( $child_post ); } } if ( $parent_id = wp_get_post_parent_id( $id ) ) { wc_delete_product_transients( $parent_id ); } break; case 'product_variation' : wc_delete_product_transients( wp_get_post_parent_id( $id ) ); break; case 'shop_order' : $refunds = $wpdb->get_results( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order_refund' AND post_parent = %d", $id ) ); foreach ( $refunds as $refund ) { wp_delete_post( $refund->ID, true ); } break; } } } /** * woocommerce_trash_post function. * * @access public * @param mixed $id * @return void */ public function trash_post( $id ) { global $wpdb; if ( $id > 0 ) { $post_type = get_post_type( $id ); if ( 'shop_order' == $post_type ) { // Delete count - meta doesn't work on trashed posts $user_id = get_post_meta( $id, '_customer_user', true ); if ( $user_id > 0 ) { update_user_meta( $user_id, '_order_count', '' ); update_user_meta( $user_id, '_money_spent', '' ); } $refunds = $wpdb->get_results( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order_refund' AND post_parent = %d", $id ) ); foreach ( $refunds as $refund ) { $wpdb->update( $wpdb->posts, array( 'post_status' => 'trash' ), array( 'ID' => $refund->ID ) ); } delete_transient( 'woocommerce_processing_order_count' ); } } } /** * woocommerce_untrash_post function. * * @access public * @param mixed $id * @return void */ public function untrash_post( $id ) { global $wpdb; if ( $id > 0 ) { $post_type = get_post_type( $id ); if ( 'shop_order' == $post_type ) { // Delete count - meta doesn't work on trashed posts $user_id = get_post_meta( $id, '_customer_user', true ); if ( $user_id > 0 ) { update_user_meta( $user_id, '_order_count', '' ); update_user_meta( $user_id, '_money_spent', '' ); } $refunds = $wpdb->get_results( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order_refund' AND post_parent = %d", $id ) ); foreach ( $refunds as $refund ) { $wpdb->update( $wpdb->posts, array( 'post_status' => 'wc-completed' ), array( 'ID' => $refund->ID ) ); } delete_transient( 'woocommerce_processing_order_count' ); } } } /** * Remove item meta on permanent deletion * * @access public * @return void **/ public function delete_order_items( $postid ) { global $wpdb; if ( get_post_type( $postid ) == 'shop_order' ) { do_action( 'woocommerce_delete_order_items', $postid ); $wpdb->query( " DELETE {$wpdb->prefix}woocommerce_order_items, {$wpdb->prefix}woocommerce_order_itemmeta FROM {$wpdb->prefix}woocommerce_order_items JOIN {$wpdb->prefix}woocommerce_order_itemmeta ON {$wpdb->prefix}woocommerce_order_items.order_item_id = {$wpdb->prefix}woocommerce_order_itemmeta.order_item_id WHERE {$wpdb->prefix}woocommerce_order_items.order_id = '{$postid}'; " ); do_action( 'woocommerce_deleted_order_items', $postid ); } } /** * Change text without slow getext filter */ public function change_featured_image_text() { global $l10n; if ( isset( $l10n['default'] ) && isset( $l10n['default']->entries ) ) { foreach ( $l10n['default']->entries as $entry_key => $entries ) { foreach ( $entries->translations as $key => $value ) { if ( 'Featured Image' == $value ) { $l10n['default']->entries[ $entry_key ]->translations[ $key ] = __( 'Product Image', 'woocommerce' ); } elseif ( 'Remove featured image' == $value ) { $l10n['default']->entries[ $entry_key ]->translations[ $key ] = __( 'Remove product image', 'woocommerce' ); } elseif ( 'Set featured image' == $value ) { $l10n['default']->entries[ $entry_key ]->translations[ $key ] = __( 'Set product image', 'woocommerce' ); } } } } } /** * Change "Featured Image" to "Product Image" throughout media modals. * * @param array $strings Array of strings to translate. * @param object $post * @return array */ public function media_view_strings( $strings = array(), $post = null ) { if ( isset( $post->post_type ) && 'product' == $post->post_type ) { $strings['setFeaturedImageTitle'] = __( 'Set product image', 'woocommerce' ); $strings['setFeaturedImage'] = __( 'Set product image', 'woocommerce' ); } return $strings; } /** * Change title boxes in admin. * @param string $text * @param object $post * @return string */ public function enter_title_here( $text, $post ) { switch ( $post->post_type ) { case 'product' : return __( 'Product name', 'woocommerce' ); break; case 'shop_coupon' : return __( 'Coupon code', 'woocommerce' ); break; } return $text; } /** * Print coupon description textarea field * @param WP_Post $post */ public function edit_form_after_title( $post ) { if ( 'shop_coupon' === $post->post_type ) { ?> labels->singular_name ); $strings['uploadedToThisPost'] = sprintf( __( 'Uploaded to this %s', 'woocommerce' ), $obj->labels->singular_name ); } return $strings; } /** * Output product visibility options. * * @access public * @return void */ public function product_data_visibility() { global $post; if ( 'product' != $post->post_type ) { return; } $current_visibility = ( $current_visibility = get_post_meta( $post->ID, '_visibility', true ) ) ? $current_visibility : apply_filters( 'woocommerce_product_visibility_default' , 'visible' ); $current_featured = ( $current_featured = get_post_meta( $post->ID, '_featured', true ) ) ? $current_featured : 'no'; $visibility_options = apply_filters( 'woocommerce_product_visibility_options', array( 'visible' => __( 'Catalog/search', 'woocommerce' ), 'catalog' => __( 'Catalog', 'woocommerce' ), 'search' => __( 'Search', 'woocommerce' ), 'hidden' => __( 'Hidden', 'woocommerce' ) ) ); ?>
' . __( 'Define the loops this product should be visible in. The product will still be accessible directly.', 'woocommerce' ) . '

'; foreach ( $visibility_options as $name => $label ) { echo '
'; } echo '

' . __( 'Enable this option to feature this product.', 'woocommerce' ) . '

'; echo '
'; ?>

get_files() ); $updated_download_ids = array_keys( (array) $downloadable_files ); $new_download_ids = array_filter( array_diff( $updated_download_ids, $existing_download_ids ) ); $removed_download_ids = array_filter( array_diff( $existing_download_ids, $updated_download_ids ) ); if ( $new_download_ids || $removed_download_ids ) { // determine whether downloadable file access has been granted via the typical order completion, or via the admin ajax method $existing_permissions = $wpdb->get_results( $wpdb->prepare( "SELECT * from {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE product_id = %d GROUP BY order_id", $product_id ) ); foreach ( $existing_permissions as $existing_permission ) { $order = wc_get_order( $existing_permission->order_id ); if ( $order->id ) { // Remove permissions if ( $removed_download_ids ) { foreach ( $removed_download_ids as $download_id ) { if ( apply_filters( 'woocommerce_process_product_file_download_paths_remove_access_to_old_file', true, $download_id, $product_id, $order ) ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE order_id = %d AND product_id = %d AND download_id = %s", $order->id, $product_id, $download_id ) ); } } } // Add permissions if ( $new_download_ids ) { foreach ( $new_download_ids as $download_id ) { if ( apply_filters( 'woocommerce_process_product_file_download_paths_grant_access_to_new_file', true, $download_id, $product_id, $order ) ) { // grant permission if it doesn't already exist if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT 1 FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE order_id = %d AND product_id = %d AND download_id = %s", $order->id, $product_id, $download_id ) ) ) { wc_downloadable_file_permission( $download_id, $product_id, $order ); } } } } } } } } } endif; new WC_Admin_Post_Types();
get_sku() ) echo $_product->get_sku() . ' - '; ?> [?]