2011-08-09 15:16:18 +00:00
< ? php
/**
2011-08-10 17:11:11 +00:00
* WooCommerce Admin
2011-08-09 15:16:18 +00:00
*
2011-08-10 17:11:11 +00:00
* Main admin file which loads all settings panels and sets up admin menus .
2011-08-09 15:16:18 +00:00
*
2011-08-10 17:11:11 +00:00
* @ author WooThemes
2011-08-09 15:16:18 +00:00
* @ category Admin
2011-08-10 17:11:11 +00:00
* @ package WooCommerce
2011-08-09 15:16:18 +00:00
*/
2011-08-10 17:11:11 +00:00
include_once ( 'admin-settings.php' );
include_once ( 'admin-install.php' );
2011-08-09 15:16:18 +00:00
2011-08-10 17:11:11 +00:00
function woocommerce_admin_init () {
include_once ( 'admin-attributes.php' );
include_once ( 'admin-dashboard.php' );
include_once ( 'admin-import.php' );
include_once ( 'admin-post-types.php' );
include_once ( 'writepanels/writepanels-init.php' );
2011-08-09 15:16:18 +00:00
}
2011-08-10 17:11:11 +00:00
add_action ( 'admin_init' , 'woocommerce_admin_init' );
2011-08-09 15:16:18 +00:00
/**
* Admin Menus
*
* Sets up the admin menus in wordpress .
*/
2011-08-10 17:11:11 +00:00
function woocommerce_admin_menu () {
2011-08-09 15:16:18 +00:00
global $menu ;
2011-08-10 17:11:11 +00:00
$menu [] = array ( '' , 'read' , 'separator-woocommerce' , '' , 'wp-menu-separator' );
2011-08-09 15:16:18 +00:00
2011-08-19 14:48:41 +00:00
add_menu_page ( __ ( 'WooCommerce' ), __ ( 'WooCommerce' ), 'manage_woocommerce' , 'woocommerce' , 'woocommerce_settings' , woocommerce :: plugin_url () . '/assets/images/icons/menu_icons.png' , 56 );
add_submenu_page ( 'woocommerce' , __ ( 'General Settings' , 'woothemes' ), __ ( 'Settings' , 'woothemes' ) , 'manage_woocommerce' , 'woocommerce' , 'woocommerce_settings' );
2011-08-13 16:07:10 +00:00
add_submenu_page ( 'edit.php?post_type=product' , __ ( 'Attributes' , 'woothemes' ), __ ( 'Attributes' , 'woothemes' ), 'manage_woocommerce' , 'attributes' , 'woocommerce_attributes' );
2011-08-09 15:16:18 +00:00
}
2011-08-10 17:11:11 +00:00
function woocommerce_admin_menu_order ( $menu_order ) {
2011-08-09 15:16:18 +00:00
// Initialize our custom order array
2011-08-10 17:11:11 +00:00
$woocommerce_menu_order = array ();
2011-08-09 15:16:18 +00:00
// Get the index of our custom separator
2011-08-10 17:11:11 +00:00
$woocommerce_separator = array_search ( 'separator-woocommerce' , $menu_order );
2011-08-09 15:16:18 +00:00
// Loop through menu order and do some rearranging
foreach ( $menu_order as $index => $item ) :
2011-08-10 17:11:11 +00:00
if ( ( ( 'woocommerce' ) == $item ) ) :
$woocommerce_menu_order [] = 'separator-woocommerce' ;
unset ( $menu_order [ $woocommerce_separator ] );
2011-08-09 15:16:18 +00:00
endif ;
2011-08-10 17:11:11 +00:00
if ( ! in_array ( $item , array ( 'separator-woocommerce' ) ) ) :
$woocommerce_menu_order [] = $item ;
2011-08-09 15:16:18 +00:00
endif ;
endforeach ;
// Return order
2011-08-10 17:11:11 +00:00
return $woocommerce_menu_order ;
2011-08-09 15:16:18 +00:00
}
2011-08-10 17:11:11 +00:00
function woocommerce_admin_custom_menu_order () {
2011-08-09 15:16:18 +00:00
if ( ! current_user_can ( 'manage_options' ) ) return false ;
return true ;
}
2011-08-15 16:48:24 +00:00
add_action ( 'admin_menu' , 'woocommerce_admin_menu' , 9 );
2011-08-10 17:11:11 +00:00
add_action ( 'menu_order' , 'woocommerce_admin_menu_order' );
add_action ( 'custom_menu_order' , 'woocommerce_admin_custom_menu_order' );
2011-08-09 15:16:18 +00:00
/**
* Admin Head
*
2011-08-10 17:11:11 +00:00
* Outputs some styles in the admin < head > to show icons on the woocommerce admin pages
2011-08-09 15:16:18 +00:00
*/
2011-08-10 17:11:11 +00:00
function woocommerce_admin_head () {
2011-08-09 15:16:18 +00:00
?>
< style type = " text/css " >
< ? php if ( isset ( $_GET [ 'taxonomy' ]) && $_GET [ 'taxonomy' ] == 'product_cat' ) : ?>
. icon32 - posts - product { background - position : - 243 px - 5 px ! important ; }
< ? php elseif ( isset ( $_GET [ 'taxonomy' ]) && $_GET [ 'taxonomy' ] == 'product_tag' ) : ?>
. icon32 - posts - product { background - position : - 301 px - 5 px ! important ; }
< ? php endif ; ?>
</ style >
< ? php
}
2011-08-10 17:11:11 +00:00
add_action ( 'admin_head' , 'woocommerce_admin_head' );
2011-08-09 15:16:18 +00:00
2011-08-13 13:57:48 +00:00
2011-08-10 17:11:11 +00:00
/**
* Feature a product from admin
*/
function woocommerce_feature_product () {
2011-08-09 15:16:18 +00:00
if ( ! is_admin () ) die ;
if ( ! current_user_can ( 'edit_posts' ) ) wp_die ( __ ( 'You do not have sufficient permissions to access this page.' ) );
2011-08-10 17:11:11 +00:00
if ( ! check_admin_referer ()) wp_die ( __ ( 'You have taken too long. Please go back and retry.' , 'woothemes' ) );
2011-08-09 15:16:18 +00:00
$post_id = isset ( $_GET [ 'product_id' ]) && ( int ) $_GET [ 'product_id' ] ? ( int ) $_GET [ 'product_id' ] : '' ;
if ( ! $post_id ) die ;
$post = get_post ( $post_id );
if ( ! $post ) die ;
if ( $post -> post_type !== 'product' ) die ;
2011-08-10 17:11:11 +00:00
$product = new woocommerce_product ( $post -> ID );
2011-08-09 15:16:18 +00:00
if ( $product -> is_featured ()) update_post_meta ( $post -> ID , 'featured' , 'no' );
else update_post_meta ( $post -> ID , 'featured' , 'yes' );
$sendback = remove_query_arg ( array ( 'trashed' , 'untrashed' , 'deleted' , 'ids' ), wp_get_referer () );
wp_safe_redirect ( $sendback );
}
2011-08-10 17:11:11 +00:00
add_action ( 'wp_ajax_woocommerce-feature-product' , 'woocommerce_feature_product' );
2011-08-09 15:16:18 +00:00
/**
* Returns proper post_type
*/
2011-08-10 17:11:11 +00:00
function woocommerce_get_current_post_type () {
2011-08-09 15:16:18 +00:00
global $post , $typenow , $current_screen ;
if ( $current_screen && @ $current_screen -> post_type ) return $current_screen -> post_type ;
if ( $typenow ) return $typenow ;
if ( ! empty ( $_REQUEST [ 'post_type' ]) ) return sanitize_key ( $_REQUEST [ 'post_type' ] );
if ( ! empty ( $post ) && ! empty ( $post -> post_type ) ) return $post -> post_type ;
if ( ! empty ( $_REQUEST [ 'post' ]) && ( int ) $_REQUEST [ 'post' ] ) {
$p = get_post ( $_REQUEST [ 'post' ] );
return $p ? $p -> post_type : '' ;
}
return '' ;
}
/**
2011-08-10 17:11:11 +00:00
* Categories ordering scripts
2011-08-09 15:16:18 +00:00
*/
2011-08-10 17:11:11 +00:00
function woocommerce_categories_scripts () {
2011-08-09 15:16:18 +00:00
if ( ! isset ( $_GET [ 'taxonomy' ]) || $_GET [ 'taxonomy' ] !== 'product_cat' ) return ;
2011-08-10 17:11:11 +00:00
wp_register_script ( 'woocommerce-categories-ordering' , woocommerce :: plugin_url () . '/assets/js/categories-ordering.js' , array ( 'jquery-ui-sortable' ));
wp_print_scripts ( 'woocommerce-categories-ordering' );
2011-08-09 15:16:18 +00:00
}
2011-08-10 17:11:11 +00:00
add_action ( 'admin_footer-edit-tags.php' , 'woocommerce_categories_scripts' );
2011-08-09 15:16:18 +00:00
/**
* Ajax request handling for categories ordering
*/
2011-08-10 17:11:11 +00:00
function woocommerce_categories_ordering () {
2011-08-09 15:16:18 +00:00
global $wpdb ;
$id = ( int ) $_POST [ 'id' ];
$next_id = isset ( $_POST [ 'nextid' ]) && ( int ) $_POST [ 'nextid' ] ? ( int ) $_POST [ 'nextid' ] : null ;
if ( ! $id || ! $term = get_term_by ( 'id' , $id , 'product_cat' ) ) die ( 0 );
2011-08-10 17:11:11 +00:00
woocommerce_order_categories ( $term , $next_id );
2011-08-09 15:16:18 +00:00
$children = get_terms ( 'product_cat' , " child_of= $id &menu_order=ASC&hide_empty=0 " );
if ( $term && sizeof ( $children ) ) {
echo 'children' ;
die ;
}
}
2011-08-10 17:11:11 +00:00
add_action ( 'wp_ajax_woocommerce-categories-ordering' , 'woocommerce_categories_ordering' );
2011-08-22 14:42:36 +00:00
/**
* Search by SKU ro ID for products . Adapted from code by BenIrvin ( Admin Search by ID )
*/
if ( is_admin ()) :
add_action ( 'parse_request' , 'woocommerce_admin_product_search' );
add_filter ( 'get_search_query' , 'woocommerce_admin_id_search_label' );
endif ;
function woocommerce_admin_product_search ( $wp ) {
global $pagenow , $wpdb ;
if ( 'edit.php' != $pagenow ) return ;
if ( ! isset ( $wp -> query_vars [ 's' ] ) ) return ;
if ( $wp -> query_vars [ 'post_type' ] != 'product' ) return ;
if ( '#' == substr ( $wp -> query_vars [ 's' ], 0 , 1 ) ) :
$id = absint ( substr ( $wp -> query_vars [ 's' ], 1 ) );
if ( ! $id ) return ;
unset ( $wp -> query_vars [ 's' ] );
$wp -> query_vars [ 'p' ] = $id ;
elseif ( 'SKU:' == substr ( $wp -> query_vars [ 's' ], 0 , 4 ) ) :
$sku = trim ( substr ( $wp -> query_vars [ 's' ], 4 ) );
if ( ! $sku ) return ;
$id = $wpdb -> get_var ( 'SELECT post_id FROM ' . $wpdb -> postmeta . ' WHERE meta_key="sku" AND meta_value LIKE "%' . $sku . '%";' );
if ( ! $id ) return ;
unset ( $wp -> query_vars [ 's' ] );
$wp -> query_vars [ 'p' ] = $id ;
$wp -> query_vars [ 'sku' ] = $sku ;
endif ;
}
function woocommerce_admin_id_search_label ( $query ) {
global $pagenow ;
if ( 'edit.php' != $pagenow ) return ;
$s = get_query_var ( 's' );
if ( $s ) return $query ;
$sku = get_query_var ( 'sku' );
if ( $sku ) {
global $wp ;
$post_type = get_post_type_object ( $wp -> query_vars [ 'post_type' ]);
return sprintf ( __ ( " [%s with SKU of %s] " , 'woothemes' ), $post_type -> labels -> singular_name , $sku );
}
$p = get_query_var ( 'p' );
if ( $p ) {
global $wp ;
$post_type = get_post_type_object ( $wp -> query_vars [ 'post_type' ]);
return sprintf ( __ ( " [%s with ID of %d] " , 'woothemes' ), $post_type -> labels -> singular_name , $p );
}
return $query ;
}
add_filter ( 'query_vars' , 'woocommerce_add_sku_var' );
function woocommerce_add_sku_var ( $public_query_vars ) {
$public_query_vars [] = 'sku' ;
return $public_query_vars ;
}
2011-08-28 11:38:29 +00:00
/**
* Duplicate a product action
*
* Based on 'Duplicate Post' ( http :// www . lopo . it / duplicate - post - plugin / ) by Enrico Battocchi
*/
add_action ( 'admin_action_duplicate_product' , 'woocommerce_duplicate_product_action' );
function woocommerce_duplicate_product_action () {
if ( ! ( isset ( $_GET [ 'post' ]) || isset ( $_POST [ 'post' ]) || ( isset ( $_REQUEST [ 'action' ]) && 'duplicate_post_save_as_new_page' == $_REQUEST [ 'action' ] ) ) ) {
wp_die ( __ ( 'No product to duplicate has been supplied!' , 'woothemes' ));
}
// Get the original page
$id = ( isset ( $_GET [ 'post' ]) ? $_GET [ 'post' ] : $_POST [ 'post' ]);
$post = woocommerce_get_product_to_duplicate ( $id );
// Copy the page and insert it
if ( isset ( $post ) && $post != null ) {
$new_id = woocommerce_create_duplicate_from_product ( $post );
// If you have written a plugin which uses non-WP database tables to save
// information about a page you can hook this action to dupe that data.
do_action ( 'woocommerce_duplicate_product' , $new_id , $post );
// Redirect to the edit screen for the new draft page
wp_redirect ( admin_url ( 'post.php?action=edit&post=' . $new_id ) );
exit ;
} else {
wp_die ( __ ( 'Product creation failed, could not find original product:' , 'woothemes' ) . ' ' . $id );
}
}
/**
* Duplicate a product link on products list
*/
add_filter ( 'post_row_actions' , 'woocommerce_duplicate_product_link_row' , 10 , 2 );
add_filter ( 'page_row_actions' , 'woocommerce_duplicate_product_link_row' , 10 , 2 );
function woocommerce_duplicate_product_link_row ( $actions , $post ) {
if ( function_exists ( 'duplicate_post_plugin_activation' )) return $actions ;
if ( ! current_user_can ( 'manage_woocommerce' )) return $actions ;
$actions [ 'duplicate' ] = '<a href="admin.php?action=duplicate_product&post=' . $post -> ID . '" title="' . __ ( " Make a duplicate from this product " , 'woothemes' )
. '" rel="permalink">' . __ ( " Duplicate " , 'woothemes' ) . '</a>' ;
return $actions ;
}
/**
* Duplicate a product link on edit screen
*/
add_action ( 'post_submitbox_start' , 'woocommerce_duplicate_product_post_button' );
function woocommerce_duplicate_product_post_button () {
if ( function_exists ( 'duplicate_post_plugin_activation' )) return ;
if ( ! current_user_can ( 'manage_woocommerce' )) return ;
if ( isset ( $_GET [ 'post' ] ) ) :
global $post ;
$notifyUrl = " admin.php?action=duplicate_product&post= " . $_GET [ 'post' ];
?>
< div id = " duplicate-action " >< a class = " submitduplicate duplication "
href = " <?php echo $notifyUrl ; ?> " >< ? php _e ( 'Copy to a new draft' , 'woothemes' ); ?> </a>
</ div >
< ? php
endif ;
}
/**
* Get a product from the database
*/
function woocommerce_get_product_to_duplicate ( $id ) {
global $wpdb ;
$post = $wpdb -> get_results ( " SELECT * FROM $wpdb->posts WHERE ID= $id " );
if ( $post -> post_type == " revision " ){
$id = $post -> post_parent ;
$post = $wpdb -> get_results ( " SELECT * FROM $wpdb->posts WHERE ID= $id " );
}
return $post [ 0 ];
}
/**
* Function to create the duplicate
*/
function woocommerce_create_duplicate_from_product ( $post , $parent = 0 ) {
global $wpdb ;
$new_post_author = wp_get_current_user ();
$new_post_date = current_time ( 'mysql' );
$new_post_date_gmt = get_gmt_from_date ( $new_post_date );
if ( $parent > 0 ) :
$post_parent = $parent ;
$suffix = '' ;
$post_status = 'publish' ;
else :
$post_parent = $post -> post_parent ;
$post_status = 'draft' ;
$suffix = __ ( " (Copy) " , 'woothemes' );
endif ;
$new_post_type = $post -> post_type ;
$post_content = str_replace ( " ' " , " '' " , $post -> post_content );
$post_content_filtered = str_replace ( " ' " , " '' " , $post -> post_content_filtered );
$post_excerpt = str_replace ( " ' " , " '' " , $post -> post_excerpt );
$post_title = str_replace ( " ' " , " '' " , $post -> post_title ) . $suffix ;
$post_name = str_replace ( " ' " , " '' " , $post -> post_name );
$comment_status = str_replace ( " ' " , " '' " , $post -> comment_status );
$ping_status = str_replace ( " ' " , " '' " , $post -> ping_status );
// Insert the new template in the post table
$wpdb -> query (
" INSERT INTO $wpdb->posts
( post_author , post_date , post_date_gmt , post_content , post_content_filtered , post_title , post_excerpt , post_status , post_type , comment_status , ping_status , post_password , to_ping , pinged , post_modified , post_modified_gmt , post_parent , menu_order , post_mime_type )
VALUES
( '$new_post_author->ID' , '$new_post_date' , '$new_post_date_gmt' , '$post_content' , '$post_content_filtered' , '$post_title' , '$post_excerpt' , '$post_status' , '$new_post_type' , '$comment_status' , '$ping_status' , '$post->post_password' , '$post->to_ping' , '$post->pinged' , '$new_post_date' , '$new_post_date_gmt' , '$post_parent' , '$post->menu_order' , '$post->post_mime_type' ) " );
$new_post_id = $wpdb -> insert_id ;
// Copy the taxonomies
woocommerce_duplicate_post_taxonomies ( $post -> ID , $new_post_id , $post -> post_type );
// Copy the meta information
woocommerce_duplicate_post_meta ( $post -> ID , $new_post_id );
// Copy the children (variations)
if ( $children_products =& get_children ( 'post_parent=' . $post -> ID . '&post_type=product_variation' ) ) :
if ( $children_products ) foreach ( $children_products as $child ) :
woocommerce_create_duplicate_from_product ( woocommerce_get_product_to_duplicate ( $child -> ID ), $new_post_id );
endforeach ;
endif ;
return $new_post_id ;
}
/**
* Copy the taxonomies of a post to another post
*/
function woocommerce_duplicate_post_taxonomies ( $id , $new_id , $post_type ) {
global $wpdb ;
$taxonomies = get_object_taxonomies ( $post_type ); //array("category", "post_tag");
foreach ( $taxonomies as $taxonomy ) {
$post_terms = wp_get_object_terms ( $id , $taxonomy );
for ( $i = 0 ; $i < count ( $post_terms ); $i ++ ) {
wp_set_object_terms ( $new_id , $post_terms [ $i ] -> slug , $taxonomy , true );
}
}
}
/**
* Copy the meta information of a post to another post
*/
function woocommerce_duplicate_post_meta ( $id , $new_id ) {
global $wpdb ;
$post_meta_infos = $wpdb -> get_results ( " SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id= $id " );
if ( count ( $post_meta_infos ) != 0 ) {
$sql_query = " INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) " ;
foreach ( $post_meta_infos as $meta_info ) {
$meta_key = $meta_info -> meta_key ;
$meta_value = addslashes ( $meta_info -> meta_value );
$sql_query_sel [] = " SELECT $new_id , ' $meta_key ', ' $meta_value ' " ;
}
$sql_query .= implode ( " UNION ALL " , $sql_query_sel );
$wpdb -> query ( $sql_query );
}
}
/**
* Deleting products sync
*
* Removes variations etc belonging to a deleted post
*/
add_action ( 'delete_post' , 'woocommerce_delete_product_sync' , 10 );
function woocommerce_delete_product_sync ( $id ) {
if ( ! current_user_can ( 'delete_posts' )) return ;
if ( $children_products =& get_children ( 'post_parent=' . $id . '&post_type=product_variation' ) ) :
if ( $children_products ) foreach ( $children_products as $child ) :
wp_delete_post ( $child -> ID , true );
endforeach ;
endif ;
}