Commit 0934cf7f authored by Tech No Freaky's avatar Tech No Freaky

1.0

* Configurable Min & Max Donation Amount
* Custom Error Messages
* Separate Menu with donation order listings
* Fixed Order Notes And Order Meta Added For All Products
* Fixed Saving Donation Order Id In DB [Before It Stored All Order IDS]
* Minor performance fixes
* Code Clean Up
* Removed Row Action [Quick Edit , Trash & Duplicate] Options For
Donation Product In Product Listing
parent d3e03076
=== WooCommerce Quick Donation ===
Contributors: varunms
Donate link: http://varunsridharan.in
Tags: Woocommerce,Quick Dontion,quick donation,online donation,wordpress donation,simple donation,donation form,WC donation,Online Payment,Payment,Online,Donate,Monthly Goal
Tags: WooCommerce,Quick Dontion,quick donation,online donation,wordpress donation,simple donation,donation form,WC donation,Online Payment,Payment,Online,Donate,Monthly Goal,affiliate, cart, checkout, commerce, configurable, digital, download, downloadable, e-commerce, ecommerce, inventory, reports, sales, sell, shipping, shop, shopping, stock, store, tax, variable, widgets, woothemes, wordpress ecommerce
Requires at least: 3.0 plus WooCommerce 2.x or higher
Tested up to: 4.1 + WooCommerce 2.x
Stable tag: 0.4
Stable tag: 1.0
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Trurns WooCommerce Into Online Donation.
Turns WooCommerce Into Online Donation.
== Description ==
<h3> What's New In 1.0 </h3>
* Configurable Min & Max Donation Amount
* Custom Error Messages
* Separate Menu with donation order listings
<h3> Feature Will Be Implemented In Next Release </h3>
* Separate Donation Report Page
* Useful Filters
<h3> <blink> Features </blink></h3>
* Redirect User After Donation Added To Cart [Cart Page / Checkout Page]
* Select Your Preferred Payment Gateway For Donation
* Custom Email Template For Donation Processing
* Custom Email Template For Donation Completed
* Some Minor Bug Fix
<h3> What We Will Give In Up Coming Releases </h3>
* Customized Report Page [Need Help]
* Better Email Template
* Target / Goal For The Project
* Configurable Min & Max Donation Amount
* Custom Error Messages
WooCommerce Shopping Cart Donation which makes woocoomerce to use for online donation purpose.
WooCommerce Shopping Cart Donation which makes WooComerce to use for online donation purpose.
This plugin will create a new product in the name of **donation**.
......@@ -46,19 +51,38 @@ This Plugin Can called by using the below short code
Plugin Settings : ***Woocoomerce Settings => Quick Donation***
Email Template Settings : ***Woocommerce Settings => Emails => Donation Processing & Completed***
Email Template Settings : ***WooCommerce Settings => Emails => Donation Processing & Completed***
== Upgrade Notice ==
We have updated ***donation-form.php*** template. so please replace the template if you have modified
== Installation ==
= Minimum Requirements =
* WordPress 3.8 or greater
* PHP version 5.2.4 or greater
* MySQL version 5.0 or greater
= Automatic installation =
Automatic installation is the easiest option as WordPress handles the file transfers itself and you don't need to leave your web browser. To do an automatic install of WooCommerce Quick Donation, log in to your WordPress dashboard, navigate to the Plugins menu and click Add New.
In the search field type "WooCommerce Quick Donation" and click Search Plugins. Once you've found our eCommerce plugin you can view details about it such as the the point release, rating and description. Most importantly of course, you can install it by simply clicking "Install Now"
= Manual installation =
The manual installation method involves downloading our plugin and uploading it to your Web Server via your favourite FTP application. The WordPress codex contains [instructions on how to do this here](http://codex.wordpress.org/Managing_Plugins#Manual_Plugin_Installation).
1. Installing alternatives:
* *via Admin Dashboard:* Go to 'Plugins > Add New', search for "WooCommerce Quick Donation", click "install"
* *OR via direct ZIP upload:* Upload the ZIP package via 'Plugins > Add New > Upload' in your WP Admin
* *OR via FTP upload:* Upload `woocommerce-quick-donation` folder to the `/wp-content/plugins/` directory
* *OR via FTP upload:* Upload `WooCommerce-quick-donation` folder to the `/wp-content/plugins/` directory
2. Activate the plugin through the 'Plugins' menu in WordPress
3. For Settings Look at your `Woocommerce => Settings => WC Quick Donation`
3. For Settings Look at your `WooCommerce => Settings => WC Quick Donation`
......@@ -78,24 +102,42 @@ Project is like [category / division]. for which you donation. multiple can be e
**Donation Plugin Not Working After Upgrading To 0.2**
As we have updated ***donation-form.php*** template. it may not be working with the old one. so please replace the template if you have modified or contact us.
**How i can get project name in email template**
**How I can get project name in email template**
You can get the name by calling the variable `$project_name`
**Where can I request new features**
Please open an issue at <a href="https://github.com/technofreaky/woocomerce-quick-donation/"> GitHub </a> and we will look into it
**I have an idea for your plugin!**
That's great. We are always open to your input, and we would like to add anything we think will be useful to a lot of people. Please send your comment/idea to varunsridharan23@gmail.com
**I found a bug!**
Oops. Please User github / WordPress to post bugs. <a href="https://github.com/technofreaky/woocomerce-quick-donation/"> Open an Issue </a>
**WooCommerce Quick Donation is awesome! Can I contribute?**
Yes you can! Join in on our <a href="https://github.com/technofreaky/woocomerce-quick-donation/">GitHub repository :)</a>
== Screenshots ==
1. Settings Panel
2. Email Template Settings For Donation Processing
3. Email Template Settings For Donation Completed.
1. General Settings
2. Donation Settings
3. Custom Error Message
4. Email Template Settings For Donation Processing
5. Email Template Settings For Donation Completed.
== Changelog ==
= 1.0 =
* Configurable Min & Max Donation Amount
* Custom Error Messages
* Separate Menu with donation order listings
* Fixed Order Notes And Order Meta Added For All Products
* Fixed Saving Donation Order Id In DB [Before It Stored All Order IDS]
* Minor performance fixes
* Code Clean Up
* Removed Row Action [Quick Edit , Trash & Duplicate] Options For Donation Product In Product Listing
= 0.4 =
* Internal Server Error / php error fixed while adding donation to cart [WP : 4.1 | WC : 2.3.3]
* Added Generator Meta Tag
* Minor Bug Fix
= 0.3 =
......
screenshot-1.png

53 KB | W: | H:

screenshot-1.png

34.1 KB | W: | H:

screenshot-1.png
screenshot-1.png
screenshot-1.png
screenshot-1.png
  • 2-up
  • Swipe
  • Onion skin
screenshot-2.png

60 KB | W: | H:

screenshot-2.png

36.2 KB | W: | H:

screenshot-2.png
screenshot-2.png
screenshot-2.png
screenshot-2.png
  • 2-up
  • Swipe
  • Onion skin
screenshot-3.png

59.2 KB | W: | H:

screenshot-3.png

48.5 KB | W: | H:

screenshot-3.png
screenshot-3.png
screenshot-3.png
screenshot-3.png
  • 2-up
  • Swipe
  • Onion skin
<?php
/**
* Posts List Table class.
*
* @package WordPress
* @subpackage List_Table
* @since 3.1.0
* @access private
*/
class WC_Quick_Donation_Listing_Table extends WP_List_Table {
protected $hierarchical_display;
protected $comment_pending_count;
private $user_posts_count;
private $sticky_posts_count = 0;
private $post_query;
public function __construct($query) {
global $post_type_object, $wpdb;
parent::__construct( array(
'plural' => 'posts',
'screen' => get_current_screen(),
) );
$this->screen->post_type = 'shop_order';
$post_type = $this->screen->post_type;
$post_type_object = get_post_type_object( $post_type );
$this->user_posts_count = 0;
$this->sticky_posts_count = 0;
$this->post_query = $query;
}
public function ajax_user_can() {
return current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_posts );
}
public function prepare_items() {
global $avail_post_stati, $per_page, $mode;
$avail_post_stati = wp_edit_posts_query();
$this->hierarchical_display = ( is_post_type_hierarchical( $this->screen->post_type ) && 'menu_order title' == $this->post_query->query['orderby'] );
$total_items = $this->hierarchical_display ? $this->post_query->post_count : $this->post_query->found_posts;
$post_type = $this->screen->post_type;
$per_page = $this->get_items_per_page( 'edit_' . $post_type . '_per_page' );
/** This filter is documented in wp-admin/includes/post.php */
$per_page = apply_filters( 'edit_posts_per_page', $per_page, $post_type );
if ( $this->hierarchical_display )
$total_pages = ceil( $total_items / $per_page );
else
$total_pages = $this->post_query->max_num_pages;
if ( ! empty( $_REQUEST['mode'] ) ) {
$mode = $_REQUEST['mode'] == 'excerpt' ? 'excerpt' : 'list';
set_user_setting ( 'posts_list_mode', $mode );
} else {
$mode = get_user_setting ( 'posts_list_mode', 'list' );
}
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
$this->is_trash = isset( $_REQUEST['post_status'] ) && $_REQUEST['post_status'] == 'trash';
$this->set_pagination_args( array(
'total_items' => $total_items,
'total_pages' => $total_pages,
'per_page' => $per_page
) );
}
public function has_items() {
return have_posts();
}
public function no_items() {
if ( isset( $_REQUEST['post_status'] ) && 'trash' == $_REQUEST['post_status'] )
echo get_post_type_object( $this->screen->post_type )->labels->not_found_in_trash;
else
echo get_post_type_object( $this->screen->post_type )->labels->not_found;
}
protected function get_views() {
global $locked_post_status, $avail_post_stati;
$post_type = $this->screen->post_type;
if ( !empty($locked_post_status) )
return array();
$status_links = array();
$num_posts = wp_count_posts( $post_type, 'readable' );
$class = '';
$allposts = '';
$current_user_id = get_current_user_id();
if ( $this->user_posts_count ) {
if ( isset( $_GET['author'] ) && ( $_GET['author'] == $current_user_id ) )
$class = ' class="current"';
$status_links['mine'] = "<a href='edit.php?post_type=$post_type&author=$current_user_id'$class>" . sprintf( _nx( 'Mine <span class="count">(%s)</span>', 'Mine <span class="count">(%s)</span>', $this->user_posts_count, 'posts' ), number_format_i18n( $this->user_posts_count ) ) . '</a>';
$allposts = '&all_posts=1';
}
$total_posts = array_sum( (array) $num_posts );
// Subtract post types that are not included in the admin all list.
foreach ( get_post_stati( array('show_in_admin_all_list' => false) ) as $state )
$total_posts -= $num_posts->$state;
$class = empty( $class ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : '';
$status_links['all'] = "<a href='edit.php?post_type=$post_type{$allposts}'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_posts, 'posts' ), number_format_i18n( $total_posts ) ) . '</a>';
foreach ( get_post_stati(array('show_in_admin_status_list' => true), 'objects') as $status ) {
$class = '';
$status_name = $status->name;
if ( !in_array( $status_name, $avail_post_stati ) )
continue;
if ( empty( $num_posts->$status_name ) )
continue;
if ( isset($_REQUEST['post_status']) && $status_name == $_REQUEST['post_status'] )
$class = ' class="current"';
$status_links[$status_name] = "<a href='edit.php?post_status=$status_name&amp;post_type=$post_type'$class>" . sprintf( translate_nooped_plural( $status->label_count, $num_posts->$status_name ), number_format_i18n( $num_posts->$status_name ) ) . '</a>';
}
if ( ! empty( $this->sticky_posts_count ) ) {
$class = ! empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : '';
$sticky_link = array( 'sticky' => "<a href='edit.php?post_type=$post_type&amp;show_sticky=1'$class>" . sprintf( _nx( 'Sticky <span class="count">(%s)</span>', 'Sticky <span class="count">(%s)</span>', $this->sticky_posts_count, 'posts' ), number_format_i18n( $this->sticky_posts_count ) ) . '</a>' );
// Sticky comes after Publish, or if not listed, after All.
$split = 1 + array_search( ( isset( $status_links['publish'] ) ? 'publish' : 'all' ), array_keys( $status_links ) );
$status_links = array_merge( array_slice( $status_links, 0, $split ), $sticky_link, array_slice( $status_links, $split ) );
}
return $status_links;
}
protected function get_bulk_actions() {
$actions = array();
$post_type_obj = get_post_type_object( $this->screen->post_type );
if ( $this->is_trash ) {
$actions['untrash'] = __( 'Restore' );
} else {
$actions['edit'] = __( 'Edit' );
}
if ( current_user_can( $post_type_obj->cap->delete_posts ) ) {
if ( $this->is_trash || ! EMPTY_TRASH_DAYS ) {
$actions['delete'] = __( 'Delete Permanently' );
} else {
$actions['trash'] = __( 'Move to Trash' );
}
}
return $actions;
}
/**
* @global int $cat
* @param string $which
*/
protected function extra_tablenav( $which ) {
global $cat;
?>
<div class="alignleft actions">
<?php
if ( 'top' == $which && !is_singular() ) {
$this->months_dropdown( $this->screen->post_type );
if ( is_object_in_taxonomy( $this->screen->post_type, 'category' ) ) {
$dropdown_options = array(
'show_option_all' => __( 'All categories' ),
'hide_empty' => 0,
'hierarchical' => 1,
'show_count' => 0,
'orderby' => 'name',
'selected' => $cat
);
echo '<label class="screen-reader-text" for="cat">' . __( 'Filter by category' ) . '</label>';
wp_dropdown_categories( $dropdown_options );
}
/**
* Fires before the Filter button on the Posts and Pages list tables.
*
* The Filter button allows sorting by date and/or category on the
* Posts list table, and sorting by date on the Pages list table.
*
* @since 2.1.0
*/
do_action( 'restrict_manage_posts' );
submit_button( __( 'Filter' ), 'button', 'filter_action', false, array( 'id' => 'post-query-submit' ) );
}
if ( $this->is_trash && current_user_can( get_post_type_object( $this->screen->post_type )->cap->edit_others_posts ) ) {
submit_button( __( 'Empty Trash' ), 'apply', 'delete_all', false );
}
?>
</div>
<?php
}
public function current_action() {
if ( isset( $_REQUEST['delete_all'] ) || isset( $_REQUEST['delete_all2'] ) )
return 'delete_all';
return parent::current_action();
}
/**
* @global string $mode
* @param string $which
*/
protected function pagination( $which ) {
global $mode;
parent::pagination( $which );
if ( 'top' == $which && ! is_post_type_hierarchical( $this->screen->post_type ) )
$this->view_switcher( $mode );
}
protected function get_table_classes() {
return array( 'widefat', 'fixed', is_post_type_hierarchical( $this->screen->post_type ) ? 'pages' : 'posts' );
}
public function get_columns() {
$post_type = $this->screen->post_type;
$posts_columns = array();
$posts_columns['cb'] = '<input type="checkbox" />';
/* translators: manage posts column name */
$posts_columns['title'] = _x( 'Title', 'column name' );
if ( post_type_supports( $post_type, 'author' ) ) {
$posts_columns['author'] = __( 'Author' );
}
$taxonomies = get_object_taxonomies( $post_type, 'objects' );
$taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );
/**
* Filter the taxonomy columns in the Posts list table.
*
* The dynamic portion of the hook name, `$post_type`, refers to the post
* type slug.
*
* @since 3.5.0
*
* @param array $taxonomies Array of taxonomies to show columns for.
* @param string $post_type The post type.
*/
$taxonomies = apply_filters( "manage_taxonomies_for_{$post_type}_columns", $taxonomies, $post_type );
$taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );
foreach ( $taxonomies as $taxonomy ) {
if ( 'category' == $taxonomy )
$column_key = 'categories';
elseif ( 'post_tag' == $taxonomy )
$column_key = 'tags';
else
$column_key = 'taxonomy-' . $taxonomy;
$posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;
}
$post_status = !empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all';
if ( post_type_supports( $post_type, 'comments' ) && !in_array( $post_status, array( 'pending', 'draft', 'future' ) ) )
$posts_columns['comments'] = '<span class="vers"><span title="' . esc_attr__( 'Comments' ) . '" class="comment-grey-bubble"></span></span>';
$posts_columns['date'] = __( 'Date' );
if ( 'page' == $post_type ) {
/**
* Filter the columns displayed in the Pages list table.
*
* @since 2.5.0
*
* @param array $post_columns An array of column names.
*/
$posts_columns = apply_filters( 'manage_pages_columns', $posts_columns );
} else {
/**
* Filter the columns displayed in the Posts list table.
*
* @since 1.5.0
*
* @param array $posts_columns An array of column names.
* @param string $post_type The post type slug.
*/
$posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );
}
/**
* Filter the columns displayed in the Posts list table for a specific post type.
*
* The dynamic portion of the hook name, `$post_type`, refers to the post type slug.
*
* @since 3.0.0
*
* @param array $post_columns An array of column names.
*/
$posts_columns = apply_filters( "manage_{$post_type}_posts_columns", $posts_columns );
return $posts_columns;
}
protected function get_sortable_columns() {
return array(
'title' => 'title',
'parent' => 'parent',
'comments' => 'comment_count',
'date' => array( 'date', true )
);
}
/**
* @global WP_Query $wp_query
* @global int $per_page
* @param array $posts
* @param int $level
*/
public function display_rows( $posts = array(), $level = 0 ) {
global $wp_query, $per_page;
if ( empty( $posts ) )
$posts = $this->post_query->posts;
add_filter( 'the_title', 'esc_html' );
if ( $this->hierarchical_display ) {
$this->_display_rows_hierarchical( $posts, $this->get_pagenum(), $per_page );
} else {
$this->_display_rows( $posts, $level );
}
}
/**
* @global string $mode
* @param array $posts
* @param int $level
*/
private function _display_rows( $posts, $level = 0 ) {
global $mode;
// Create array of post IDs.
$post_ids = array();
foreach ( $posts as $a_post )
$post_ids[] = $a_post->ID;
$this->comment_pending_count = get_pending_comments_num( $post_ids );
foreach ( $posts as $post )
$this->single_row( $post, $level );
}
/**
* @global wpdb $wpdb
* @param array $pages
* @param int $pagenum
* @param int $per_page
* @return bool|null
*/
private function _display_rows_hierarchical( $pages, $pagenum = 1, $per_page = 20 ) {
global $wpdb;
$level = 0;
if ( ! $pages ) {
$pages = get_pages( array( 'sort_column' => 'menu_order' ) );
if ( ! $pages )
return false;
}
/*
* Arrange pages into two parts: top level pages and children_pages
* children_pages is two dimensional array, eg.
* children_pages[10][] contains all sub-pages whose parent is 10.
* It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations
* If searching, ignore hierarchy and treat everything as top level
*/
if ( empty( $_REQUEST['s'] ) ) {
$top_level_pages = array();
$children_pages = array();
foreach ( $pages as $page ) {
// Catch and repair bad pages.
if ( $page->post_parent == $page->ID ) {
$page->post_parent = 0;
$this->post_query->update( $this->post_query->posts, array( 'post_parent' => 0 ), array( 'ID' => $page->ID ) );
clean_post_cache( $page );
}
if ( 0 == $page->post_parent )
$top_level_pages[] = $page;
else
$children_pages[ $page->post_parent ][] = $page;
}
$pages = &$top_level_pages;
}
$count = 0;
$start = ( $pagenum - 1 ) * $per_page;
$end = $start + $per_page;
foreach ( $pages as $page ) {
if ( $count >= $end )
break;
if ( $count >= $start ) {
echo "\t";
$this->single_row( $page, $level );
}
$count++;
if ( isset( $children_pages ) )
$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
}
// If it is the last pagenum and there are orphaned pages, display them with paging as well.
if ( isset( $children_pages ) && $count < $end ){
foreach ( $children_pages as $orphans ){
foreach ( $orphans as $op ) {
if ( $count >= $end )
break;
if ( $count >= $start ) {
echo "\t";
$this->single_row( $op, 0 );
}
$count++;
}
}
}
}
/**
* Given a top level page ID, display the nested hierarchy of sub-pages
* together with paging support
*
* @since 3.1.0 (Standalone function exists since 2.6.0)
*
* @param array $children_pages
* @param int $count
* @param int $parent
* @param int $level
* @param int $pagenum
* @param int $per_page
*/
private function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) {
if ( ! isset( $children_pages[$parent] ) )
return;
$start = ( $pagenum - 1 ) * $per_page;
$end = $start + $per_page;
foreach ( $children_pages[$parent] as $page ) {
if ( $count >= $end )
break;
// If the page starts in a subtree, print the parents.
if ( $count == $start && $page->post_parent > 0 ) {
$my_parents = array();
$my_parent = $page->post_parent;
while ( $my_parent ) {
$my_parent = get_post( $my_parent );
$my_parents[] = $my_parent;
if ( !$my_parent->post_parent )
break;
$my_parent = $my_parent->post_parent;
}
$num_parents = count( $my_parents );
while ( $my_parent = array_pop( $my_parents ) ) {
echo "\t";
$this->single_row( $my_parent, $level - $num_parents );
$num_parents--;
}
}
if ( $count >= $start ) {
echo "\t";
$this->single_row( $page, $level );
}
$count++;
$this->_page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
}
unset( $children_pages[$parent] ); //required in order to keep track of orphans
}
/**
* @global string $mode
* @staticvar string $alternate
* @param WP_Post $post
* @param int $level
*/
public function single_row( $post, $level = 0 ) {
global $mode;
static $alternate;
$global_post = get_post();
$GLOBALS['post'] = $post;
setup_postdata( $post );
$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( 'edit_post', $post->ID );
$alternate = 'alternate' == $alternate ? '' : 'alternate';
$classes = $alternate . ' iedit author-' . ( get_current_user_id() == $post->post_author ? 'self' : 'other' );
$lock_holder = wp_check_post_lock( $post->ID );
if ( $lock_holder ) {
$classes .= ' wp-locked';
$lock_holder = get_userdata( $lock_holder );
}
if ( $post->post_parent ) {
$count = count( get_post_ancestors( $post->ID ) );
$classes .= ' level-'. $count;
} else {
$classes .= ' level-0';
}
?>
<tr id="post-<?php echo $post->ID; ?>" class="<?php echo implode( ' ', get_post_class( $classes, $post->ID ) ); ?>">
<?php
list( $columns, $hidden ) = $this->get_column_info();
foreach ( $columns as $column_name => $column_display_name ) {
$class = "class=\"$column_name column-$column_name\"";
$style = '';
if ( in_array( $column_name, $hidden ) )
$style = ' style="display:none;"';
$attributes = "$class$style";
switch ( $column_name ) {
case 'cb':
?>
<th scope="row" class="check-column">
<?php
if ( $can_edit_post ) {
?>
<label class="screen-reader-text" for="cb-select-<?php the_ID(); ?>"><?php printf( __( 'Select %s' ), $title ); ?></label>
<input id="cb-select-<?php the_ID(); ?>" type="checkbox" name="post[]" value="<?php the_ID(); ?>" />
<div class="locked-indicator"></div>
<?php
}
?>
</th>
<?php
break;
case 'title':
$attributes = 'class="post-title page-title column-title"' . $style;
if ( $this->hierarchical_display ) {
if ( 0 == $level && (int) $post->post_parent > 0 ) {
// Sent level 0 by accident, by default, or because we don't know the actual level.
$find_main_page = (int) $post->post_parent;
while ( $find_main_page > 0 ) {
$parent = get_post( $find_main_page );
if ( is_null( $parent ) )
break;
$level++;
$find_main_page = (int) $parent->post_parent;
if ( !isset( $parent_name ) ) {
/** This filter is documented in wp-includes/post-template.php */
$parent_name = apply_filters( 'the_title', $parent->post_title, $parent->ID );
}
}
}
}
$pad = str_repeat( '&#8212; ', $level );
echo "<td $attributes><strong>";
if ( $format = get_post_format( $post->ID ) ) {
$label = get_post_format_string( $format );
echo '<a href="' . esc_url( add_query_arg( array( 'post_format' => $format, 'post_type' => $post->post_type ), 'edit.php' ) ) . '" class="post-state-format post-format-icon post-format-' . $format . '" title="' . $label . '">' . $label . ":</a> ";
}
if ( $can_edit_post && $post->post_status != 'trash' ) {
echo '<a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ) . '">' . $pad . $title . '</a>';
} else {
echo $pad . $title;
}
_post_states( $post );
if ( isset( $parent_name ) )
echo ' | ' . $post_type_object->labels->parent_item_colon . ' ' . esc_html( $parent_name );
echo "</strong>\n";
if ( $can_edit_post && $post->post_status != 'trash' ) {
if ( $lock_holder ) {
$locked_avatar = get_avatar( $lock_holder->ID, 18 );
$locked_text = esc_html( sprintf( __( '%s is currently editing' ), $lock_holder->display_name ) );
} else {
$locked_avatar = $locked_text = '';
}
echo '<div class="locked-info"><span class="locked-avatar">' . $locked_avatar . '</span> <span class="locked-text">' . $locked_text . "</span></div>\n";
}
if ( ! $this->hierarchical_display && 'excerpt' == $mode && current_user_can( 'read_post', $post->ID ) )
the_excerpt();
$actions = array();
if ( $can_edit_post && 'trash' != $post->post_status ) {
$actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '" title="' . esc_attr__( 'Edit this item' ) . '">' . __( 'Edit' ) . '</a>';
$actions['inline hide-if-no-js'] = '<a href="#" class="editinline" title="' . esc_attr__( 'Edit this item inline' ) . '">' . __( 'Quick&nbsp;Edit' ) . '</a>';
}
if ( current_user_can( 'delete_post', $post->ID ) ) {
if ( 'trash' == $post->post_status )
$actions['untrash'] = "<a title='" . esc_attr__( 'Restore this item from the Trash' ) . "' href='" . wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $post->ID ) ), 'untrash-post_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";
elseif ( EMPTY_TRASH_DAYS )
$actions['trash'] = "<a class='submitdelete' title='" . esc_attr__( 'Move this item to the Trash' ) . "' href='" . get_delete_post_link( $post->ID ) . "'>" . __( 'Trash' ) . "</a>";
if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS )
$actions['delete'] = "<a class='submitdelete' title='" . esc_attr__( 'Delete this item permanently' ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently' ) . "</a>";
}
if ( $post_type_object->public ) {
if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) {
if ( $can_edit_post ) {
$preview_link = set_url_scheme( get_permalink( $post->ID ) );
/** This filter is documented in wp-admin/includes/meta-boxes.php */
$preview_link = apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ), $post );
$actions['view'] = '<a href="' . esc_url( $preview_link ) . '" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ) . '" rel="permalink">' . __( 'Preview' ) . '</a>';
}
} elseif ( 'trash' != $post->post_status ) {
$actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';
}
}
if ( is_post_type_hierarchical( $post->post_type ) ) {
/**
* Filter the array of row action links on the Pages list table.
*
* The filter is evaluated only for hierarchical post types.
*
* @since 2.8.0
*
* @param array $actions An array of row action links. Defaults are
* 'Edit', 'Quick Edit', 'Restore, 'Trash',
* 'Delete Permanently', 'Preview', and 'View'.
* @param WP_Post $post The post object.
*/
$actions = apply_filters( 'page_row_actions', $actions, $post );
} else {
/**
* Filter the array of row action links on the Posts list table.
*
* The filter is evaluated only for non-hierarchical post types.
*
* @since 2.8.0
*
* @param array $actions An array of row action links. Defaults are
* 'Edit', 'Quick Edit', 'Restore, 'Trash',
* 'Delete Permanently', 'Preview', and 'View'.
* @param WP_Post $post The post object.
*/
$actions = apply_filters( 'post_row_actions', $actions, $post );
}
echo $this->row_actions( $actions );
get_inline_data( $post );
echo '</td>';
break;
case 'date':
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 ) {
/**
* Filter the published time of the post.
*
* If $mode equals 'excerpt', the published time and date are both displayed.
* If $mode equals 'list' (default), the publish date is displayed, with the
* time and date together available as an abbreviation definition.
*
* @since 2.5.1
*
* @param array $t_time The published time.
* @param WP_Post $post Post object.
* @param string $column_name The column name.
* @param string $mode The list display mode ('excerpt' or 'list').
*/
echo apply_filters( 'post_date_column_time', $t_time, $post, $column_name, $mode );
} else {
/** This filter is documented in wp-admin/includes/class-wp-posts-list-table.php */
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>';
break;
case 'comments':
?>
<td <?php echo $attributes ?>><div class="post-com-count-wrapper">
<?php
$pending_comments = isset( $this->comment_pending_count[$post->ID] ) ? $this->comment_pending_count[$post->ID] : 0;
$this->comments_bubble( $post->ID, $pending_comments );
?>
</div></td>
<?php
break;
case 'author':
?>
<td <?php echo $attributes ?>><?php
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()
);
?></td>
<?php
break;
default:
if ( 'categories' == $column_name )
$taxonomy = 'category';
elseif ( 'tags' == $column_name )
$taxonomy = 'post_tag';
elseif ( 0 === strpos( $column_name, 'taxonomy-' ) )
$taxonomy = substr( $column_name, 9 );
else
$taxonomy = false;
if ( $taxonomy ) {
$taxonomy_object = get_taxonomy( $taxonomy );
echo '<td ' . $attributes . '>';
if ( $terms = get_the_terms( $post->ID, $taxonomy ) ) {
$out = array();
foreach ( $terms as $t ) {
$posts_in_term_qv = array();
if ( 'post' != $post->post_type )
$posts_in_term_qv['post_type'] = $post->post_type;
if ( $taxonomy_object->query_var ) {
$posts_in_term_qv[ $taxonomy_object->query_var ] = $t->slug;
} else {
$posts_in_term_qv['taxonomy'] = $taxonomy;
$posts_in_term_qv['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' ) )
);
}
/* translators: used between list items, there is a space after the comma */
echo join( __( ', ' ), $out );
} else {
echo '&#8212;';
}
echo '</td>';
break;
}
?>
<td <?php echo $attributes ?>><?php
if ( is_post_type_hierarchical( $post->post_type ) ) {
/**
* Fires in each custom column on the Posts list table.
*
* This hook only fires if the current post type is hierarchical,
* such as pages.
*
* @since 2.5.0
*
* @param string $column_name The name of the column to display.
* @param int $post_id The current post ID.
*/
do_action( 'manage_pages_custom_column', $column_name, $post->ID );
} else {
/**
* Fires in each custom column in the Posts list table.
*
* This hook only fires if the current post type is non-hierarchical,
* such as posts.
*
* @since 1.5.0
*
* @param string $column_name The name of the column to display.
* @param int $post_id The current post ID.
*/
do_action( 'manage_posts_custom_column', $column_name, $post->ID );
}
/**
* Fires for each custom column of a specific post type in the Posts list table.
*
* The dynamic portion of the hook name, `$post->post_type`, refers to the post type.
*
* @since 3.1.0
*
* @param string $column_name The name of the column to display.
* @param int $post_id The current post ID.
*/
do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
?></td>
<?php
break;
}
}
?>
</tr>
<?php
$GLOBALS['post'] = $global_post;
}
/**
* Outputs the hidden row displayed when inline editing
*
* @since 3.1.0
*/
public function inline_edit() {
global $mode;
$screen = $this->screen;
$post = get_default_post_to_edit( $screen->post_type );
$post_type_object = get_post_type_object( $screen->post_type );
$taxonomy_names = get_object_taxonomies( $screen->post_type );
$hierarchical_taxonomies = array();
$flat_taxonomies = array();
foreach ( $taxonomy_names as $taxonomy_name ) {
$taxonomy = get_taxonomy( $taxonomy_name );
if ( !$taxonomy->show_ui )
continue;
if ( $taxonomy->hierarchical )
$hierarchical_taxonomies[] = $taxonomy;
else
$flat_taxonomies[] = $taxonomy;
}
$m = ( isset( $mode ) && 'excerpt' == $mode ) ? 'excerpt' : 'list';
$can_publish = current_user_can( $post_type_object->cap->publish_posts );
$core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true );
?>
<form method="get" action=""><table style="display: none"><tbody id="inlineedit">
<?php
$hclass = count( $hierarchical_taxonomies ) ? 'post' : 'page';
$bulk = 0;
while ( $bulk < 2 ) { ?>
<tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="inline-edit-row inline-edit-row-<?php echo "$hclass inline-edit-" . $screen->post_type;
echo $bulk ? " bulk-edit-row bulk-edit-row-$hclass bulk-edit-{$screen->post_type}" : " quick-edit-row quick-edit-row-$hclass inline-edit-{$screen->post_type}";
?>" style="display: none"><td colspan="<?php echo $this->get_column_count(); ?>" class="colspanchange">
<fieldset class="inline-edit-col-left"><div class="inline-edit-col">
<h4><?php echo $bulk ? __( 'Bulk Edit' ) : __( 'Quick Edit' ); ?></h4>
<?php
if ( post_type_supports( $screen->post_type, 'title' ) ) :
if ( $bulk ) : ?>
<div id="bulk-title-div">
<div id="bulk-titles"></div>
</div>
<?php else : // $bulk ?>
<label>
<span class="title"><?php _e( 'Title' ); ?></span>
<span class="input-text-wrap"><input type="text" name="post_title" class="ptitle" value="" /></span>
</label>
<label>
<span class="title"><?php _e( 'Slug' ); ?></span>
<span class="input-text-wrap"><input type="text" name="post_name" value="" /></span>
</label>
<?php endif; // $bulk
endif; // post_type_supports title ?>
<?php if ( !$bulk ) : ?>
<label><span class="title"><?php _e( 'Date' ); ?></span></label>
<div class="inline-edit-date">
<?php touch_time( 1, 1, 0, 1 ); ?>
</div>
<br class="clear" />
<?php endif; // $bulk
if ( post_type_supports( $screen->post_type, 'author' ) ) :
$authors_dropdown = '';
if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) ) :
$users_opt = array(
'hide_if_only_one_author' => false,
'who' => 'authors',
'name' => 'post_author',
'class'=> 'authors',
'multi' => 1,
'echo' => 0
);
if ( $bulk )
$users_opt['show_option_none'] = __( '&mdash; No Change &mdash;' );
if ( $authors = wp_dropdown_users( $users_opt ) ) :
$authors_dropdown = '<label class="inline-edit-author">';
$authors_dropdown .= '<span class="title">' . __( 'Author' ) . '</span>';
$authors_dropdown .= $authors;
$authors_dropdown .= '</label>';
endif;
endif; // authors
?>
<?php if ( !$bulk ) echo $authors_dropdown;
endif; // post_type_supports author
if ( !$bulk && $can_publish ) :
?>
<div class="inline-edit-group">
<label class="alignleft">
<span class="title"><?php _e( 'Password' ); ?></span>
<span class="input-text-wrap"><input type="text" name="post_password" class="inline-edit-password-input" value="" /></span>
</label>
<em style="margin:5px 10px 0 0" class="alignleft">
<?php
/* translators: Between password field and private checkbox on post quick edit interface */
echo __( '&ndash;OR&ndash;' );
?>
</em>
<label class="alignleft inline-edit-private">
<input type="checkbox" name="keep_private" value="private" />
<span class="checkbox-title"><?php echo __( 'Private' ); ?></span>
</label>
</div>
<?php endif; ?>
</div></fieldset>
<?php if ( count( $hierarchical_taxonomies ) && !$bulk ) : ?>
<fieldset class="inline-edit-col-center inline-edit-categories"><div class="inline-edit-col">
<?php foreach ( $hierarchical_taxonomies as $taxonomy ) : ?>
<span class="title inline-edit-categories-label"><?php echo esc_html( $taxonomy->labels->name ) ?></span>
<input type="hidden" name="<?php echo ( $taxonomy->name == 'category' ) ? 'post_category[]' : 'tax_input[' . esc_attr( $taxonomy->name ) . '][]'; ?>" value="0" />
<ul class="cat-checklist <?php echo esc_attr( $taxonomy->name )?>-checklist">
<?php wp_terms_checklist( null, array( 'taxonomy' => $taxonomy->name ) ) ?>
</ul>
<?php endforeach; //$hierarchical_taxonomies as $taxonomy ?>
</div></fieldset>
<?php endif; // count( $hierarchical_taxonomies ) && !$bulk ?>
<fieldset class="inline-edit-col-right"><div class="inline-edit-col">
<?php
if ( post_type_supports( $screen->post_type, 'author' ) && $bulk )
echo $authors_dropdown;
if ( post_type_supports( $screen->post_type, 'page-attributes' ) ) :
if ( $post_type_object->hierarchical ) :
?>
<label>
<span class="title"><?php _e( 'Parent' ); ?></span>
<?php
$dropdown_args = array(
'post_type' => $post_type_object->name,
'selected' => $post->post_parent,
'name' => 'post_parent',
'show_option_none' => __( 'Main Page (no parent)' ),
'option_none_value' => 0,
'sort_column' => 'menu_order, post_title',
);
if ( $bulk )
$dropdown_args['show_option_no_change'] = __( '&mdash; No Change &mdash;' );
/**
* Filter the arguments used to generate the Quick Edit page-parent drop-down.
*
* @since 2.7.0
*
* @see wp_dropdown_pages()
*
* @param array $dropdown_args An array of arguments.
*/
$dropdown_args = apply_filters( 'quick_edit_dropdown_pages_args', $dropdown_args );
wp_dropdown_pages( $dropdown_args );
?>
</label>
<?php
endif; // hierarchical
if ( !$bulk ) : ?>
<label>
<span class="title"><?php _e( 'Order' ); ?></span>
<span class="input-text-wrap"><input type="text" name="menu_order" class="inline-edit-menu-order-input" value="<?php echo $post->menu_order ?>" /></span>
</label>
<?php endif; // !$bulk
if ( 'page' == $screen->post_type ) :
?>
<label>
<span class="title"><?php _e( 'Template' ); ?></span>
<select name="page_template">
<?php if ( $bulk ) : ?>
<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
<?php endif; // $bulk ?>
<?php
/** This filter is documented in wp-admin/includes/meta-boxes.php */
$default_title = apply_filters( 'default_page_template_title', __( 'Default Template' ), 'quick-edit' );
?>
<option value="default"><?php echo esc_html( $default_title ); ?></option>
<?php page_template_dropdown() ?>
</select>
</label>
<?php
endif; // page post_type
endif; // page-attributes
?>
<?php if ( count( $flat_taxonomies ) && !$bulk ) : ?>
<?php foreach ( $flat_taxonomies as $taxonomy ) : ?>
<?php if ( current_user_can( $taxonomy->cap->assign_terms ) ) : ?>
<label class="inline-edit-tags">
<span class="title"><?php echo esc_html( $taxonomy->labels->name ) ?></span>
<textarea cols="22" rows="1" name="tax_input[<?php echo esc_attr( $taxonomy->name )?>]" class="tax_input_<?php echo esc_attr( $taxonomy->name )?>"></textarea>
</label>
<?php endif; ?>
<?php endforeach; //$flat_taxonomies as $taxonomy ?>
<?php endif; // count( $flat_taxonomies ) && !$bulk ?>
<?php if ( post_type_supports( $screen->post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) :
if ( $bulk ) : ?>
<div class="inline-edit-group">
<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>
<label class="alignleft">
<span class="title"><?php _e( 'Comments' ); ?></span>
<select name="comment_status">
<option value=""><?php _e( '&mdash; No Change &mdash;' ); ?></option>
<option value="open"><?php _e( 'Allow' ); ?></option>
<option value="closed"><?php _e( 'Do not allow' ); ?></option>
</select>
</label>
<?php endif; if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>
<label class="alignright">
<span class="title"><?php _e( 'Pings' ); ?></span>
<select name="ping_status">
<option value=""><?php _e( '&mdash; No Change &mdash;' ); ?></option>
<option value="open"><?php _e( 'Allow' ); ?></option>
<option value="closed"><?php _e( 'Do not allow' ); ?></option>
</select>
</label>
<?php endif; ?>
</div>
<?php else : // $bulk ?>
<div class="inline-edit-group">
<?php if ( post_type_supports( $screen->post_type, 'comments' ) ) : ?>
<label class="alignleft">
<input type="checkbox" name="comment_status" value="open" />
<span class="checkbox-title"><?php _e( 'Allow Comments' ); ?></span>
</label>
<?php endif; if ( post_type_supports( $screen->post_type, 'trackbacks' ) ) : ?>
<label class="alignleft">
<input type="checkbox" name="ping_status" value="open" />
<span class="checkbox-title"><?php _e( 'Allow Pings' ); ?></span>
</label>
<?php endif; ?>
</div>
<?php endif; // $bulk
endif; // post_type_supports comments or pings ?>
<div class="inline-edit-group">
<label class="inline-edit-status alignleft">
<span class="title"><?php _e( 'Status' ); ?></span>
<select name="_status">
<?php if ( $bulk ) : ?>
<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
<?php endif; // $bulk ?>
<?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review" ?>
<option value="publish"><?php _e( 'Published' ); ?></option>
<option value="future"><?php _e( 'Scheduled' ); ?></option>
<?php if ( $bulk ) : ?>
<option value="private"><?php _e( 'Private' ) ?></option>
<?php endif; // $bulk ?>
<?php endif; ?>
<option value="pending"><?php _e( 'Pending Review' ); ?></option>
<option value="draft"><?php _e( 'Draft' ); ?></option>
</select>
</label>
<?php if ( 'post' == $screen->post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
<?php if ( $bulk ) : ?>
<label class="alignright">
<span class="title"><?php _e( 'Sticky' ); ?></span>
<select name="sticky">
<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
<option value="sticky"><?php _e( 'Sticky' ); ?></option>
<option value="unsticky"><?php _e( 'Not Sticky' ); ?></option>
</select>
</label>
<?php else : // $bulk ?>
<label class="alignleft">
<input type="checkbox" name="sticky" value="sticky" />
<span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
</label>
<?php endif; // $bulk ?>
<?php endif; // 'post' && $can_publish && current_user_can( 'edit_others_cap' ) ?>
</div>
<?php
if ( $bulk && current_theme_supports( 'post-formats' ) && post_type_supports( $screen->post_type, 'post-formats' ) ) {
$post_formats = get_theme_support( 'post-formats' );
?>
<label class="alignleft" for="post_format">
<span class="title"><?php _ex( 'Format', 'post format' ); ?></span>
<select name="post_format">
<option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
<option value="0"><?php echo get_post_format_string( 'standard' ); ?></option>
<?php
foreach ( $post_formats[0] as $format ) {
?>
<option value="<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></option>
<?php
}
?>
</select></label>
<?php
}
?>
</div></fieldset>
<?php
list( $columns ) = $this->get_column_info();
foreach ( $columns as $column_name => $column_display_name ) {
if ( isset( $core_columns[$column_name] ) )
continue;
if ( $bulk ) {
/**
* Fires once for each column in Bulk Edit mode.
*
* @since 2.7.0
*
* @param string $column_name Name of the column to edit.
* @param WP_Post $post_type The post type slug.
*/
do_action( 'bulk_edit_custom_box', $column_name, $screen->post_type );
} else {
/**
* Fires once for each column in Quick Edit mode.
*
* @since 2.7.0
*
* @param string $column_name Name of the column to edit.
* @param WP_Post $post_type The post type slug.
*/
do_action( 'quick_edit_custom_box', $column_name, $screen->post_type );
}
}
?>
<p class="submit inline-edit-save">
<a accesskey="c" href="#inline-edit" class="button-secondary cancel alignleft"><?php _e( 'Cancel' ); ?></a>
<?php if ( ! $bulk ) {
wp_nonce_field( 'inlineeditnonce', '_inline_edit', false );
?>
<a accesskey="s" href="#inline-edit" class="button-primary save alignright"><?php _e( 'Update' ); ?></a>
<span class="spinner"></span>
<?php } else {
submit_button( __( 'Update' ), 'button-primary alignright', 'bulk_edit', false, array( 'accesskey' => 's' ) );
} ?>
<input type="hidden" name="post_view" value="<?php echo esc_attr( $m ); ?>" />
<input type="hidden" name="screen" value="<?php echo esc_attr( $screen->id ); ?>" />
<?php if ( ! $bulk && ! post_type_supports( $screen->post_type, 'author' ) ) { ?>
<input type="hidden" name="post_author" value="<?php echo esc_attr( $post->post_author ); ?>" />
<?php } ?>
<span class="error" style="display:none"></span>
<br class="clear" />
</p>
</td></tr>
<?php
$bulk++;
}
?>
</tbody></table></form>
<?php
}
}
function tt_render_list_page($shop){
$testListTable = new WC_Quick_Donation_Listing_Table($shop);
$testListTable->prepare_items();
?>
<div class="wrap">
<div id="icon-users" class="icon32"><br/></div>
<h2>Donations</h2>
<form id="movies-filter" method="get"> <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>" />
<?php $testListTable->display() ?>
</form>
</div>
<?php } ?>
\ No newline at end of file
<?php
/**
* WC_Report_Sales_By_Date
*
* @author WooThemes
* @category Admin
* @package WooCommerce/Admin/Reports
* @version 2.1.0
* Package : WooCommerce Quick Donation
* Since : 1.0
* Usage : Custom Report Page For Donation
*/
class WC_Report_wc_quick_donation_reports extends WC_Admin_Report {
public $chart_colours = array();
class wc_quick_donation_report {
private $donation_orderids;
private $status_count;
private $menu_name;
private $menu_slug;
/**
* Get the legend for the main chart sidebar
* @return array
* Setup WC Quick Donation Report Page
*/
public function get_chart_legend() {
$legend = array();
$legend[] = array(
'title' => 'sales in this period',
'color' => $this->chart_colours['sales_amount'],
'highlight_series' => 6
);
return $legend;
function __construct(){
$this->status_count = 0;
$this->donation_orderids = json_decode(get_option('wc_quick_donation_ids'));
$this->get_status_count();
$this->menu_name = 'Donations';
$this->menu_slug = 'wc-quick-donations-orders';
add_action('admin_menu', array($this,'register_menu'));
add_action('admin_menu', array($this,'add_donation_notification_bubble'),99);
add_filter('woocommerce_screen_ids',array($this,'set_wc_screen_ids'));
}
/**
* Output the report
*/
public function output_report() {
$ranges = array(
'year' => __( 'Year', 'woocommerce' ),
'last_month' => __( 'Last Month', 'woocommerce' ),
'month' => __( 'This Month', 'woocommerce' ),
'7day' => __( 'Last 7 Days', 'woocommerce' )
);
$this->chart_colours = array(
'sales_amount' => '#3498db',
'average' => '#75b9e7',
'order_count' => '#b8c0c5',
'item_count' => '#d4d9dc',
'coupon_amount' => '#e67e22',
'shipping_amount' => '#1abc9c',
'refund_amount' => '#c0392b'
);
$current_range = ! empty( $_GET['range'] ) ? sanitize_text_field( $_GET['range'] ) : '7day';
if ( ! in_array( $current_range, array( 'custom', 'year', 'last_month', 'month', '7day' ) ) ) {
$current_range = '7day';
public function set_wc_screen_ids($screen){
$screen[] = 'woocommerce_page_wc-quick-donations-orders';
return $screen;
}
$this->calculate_current_range( $current_range );
include( WC()->plugin_path() . '/includes/admin/views/html-report-by-date.php');
}
/**
* Output an export link
* Registers A Menu In Admin
*/
public function get_export_button() {
$current_range = ! empty( $_GET['range'] ) ? sanitize_text_field( $_GET['range'] ) : '7day';
?>
<a
href="#"
download="report-<?php echo esc_attr( $current_range ); ?>-<?php echo date_i18n( 'Y-m-d', current_time('timestamp') ); ?>.csv"
class="export_csv"
data-export="chart"
data-xaxes="<?php _e( 'Date', 'woocommerce' ); ?>"
data-exclude_series="2"
data-groupby="<?php echo $this->chart_groupby; ?>"
>
<?php _e( 'Export CSV', 'woocommerce' ); ?>
</a>
<?php
public function register_menu(){
add_submenu_page( 'woocommerce', $this->menu_name,$this->menu_name, 'view_woocommerce_reports', $this->menu_slug, array( $this, 'donation_orders_listing' ) );
}
/**
* Get the main chart
*
* @return string
*/
public function get_main_chart() {
global $wp_locale;
// Get orders and dates in range - we want the SUM of order totals, COUNT of order items, COUNT of orders, and the date
$orders = $this->get_order_report_data( array(
'data' => array(
'_order_total' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_sales'
),
'_order_shipping' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_shipping'
),
'ID' => array(
'type' => 'post_data',
'function' => 'COUNT',
'name' => 'total_orders',
'distinct' => true,
),
'post_date' => array(
'type' => 'post_data',
'function' => '',
'name' => 'post_date'
),
),
'group_by' => $this->group_by_query,
'order_by' => 'post_date ASC',
'query_type' => 'get_results',
'filter_range' => true,
'order_types' => wc_get_order_types( 'sales-reports' ),
'order_status' => array( 'completed', 'processing', 'on-hold', 'refunded' ),
) );
// Order items
$order_items = $this->get_order_report_data( array(
'data' => array(
'_qty' => array(
'type' => 'order_item_meta',
'order_item_type' => 'line_item',
'function' => 'SUM',
'name' => 'order_item_count'
),
'post_date' => array(
'type' => 'post_data',
'function' => '',
'name' => 'post_date'
),
),
'where' => array(
array(
'key' => 'order_items.order_item_type',
'value' => 'line_item',
'operator' => '='
)
),
'group_by' => $this->group_by_query,
'order_by' => 'post_date ASC',
'query_type' => 'get_results',
'filter_range' => true,
'order_types' => wc_get_order_types( 'sales-reports' ),
'order_status' => array( 'completed', 'processing', 'on-hold', 'refunded' ),
) );
// Get discount amounts in range
$coupons = $this->get_order_report_data( array(
'data' => array(
'order_item_name' => array(
'type' => 'order_item',
'function' => '',
'name' => 'order_item_name'
),
'discount_amount' => array(
'type' => 'order_item_meta',
'order_item_type' => 'coupon',
'function' => 'SUM',
'name' => 'discount_amount'
),
'post_date' => array(
'type' => 'post_data',
'function' => '',
'name' => 'post_date'
),
),
'where' => array(
array(
'key' => 'order_items.order_item_type',
'value' => 'coupon',
'operator' => '='
)
),
'group_by' => $this->group_by_query . ', order_item_name',
'order_by' => 'post_date ASC',
'query_type' => 'get_results',
'filter_range' => true,
'order_types' => wc_get_order_types( 'sales-reports' ),
'order_status' => array( 'completed', 'processing', 'on-hold', 'refunded' ),
) );
$partial_refunds = $this->get_order_report_data( array(
'data' => array(
'_refund_amount' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_refund'
),
'post_date' => array(
'type' => 'post_data',
'function' => '',
'name' => 'post_date'
)
),
'group_by' => $this->group_by_query,
'order_by' => 'post_date ASC',
'query_type' => 'get_results',
'filter_range' => true,
'order_status' => false,
'parent_order_status' => array( 'completed', 'processing', 'on-hold' ),
) );
$full_refunds = $this->get_order_report_data( array(
'data' => array(
'_order_total' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_refund'
),
'post_date' => array(
'type' => 'post_data',
'function' => '',
'name' => 'post_date'
),
),
'group_by' => $this->group_by_query,
'order_by' => 'post_date ASC',
'query_type' => 'get_results',
'filter_range' => true,
'order_status' => array( 'refunded' ),
) );
$refunds = array_merge($partial_refunds, $full_refunds);
public function add_donation_notification_bubble() {
global $submenu;
if(isset($submenu['woocommerce'])){
// Prepare data for report
$order_counts = $this->prepare_chart_data( $orders, 'post_date', 'total_orders', $this->chart_interval, $this->start_date, $this->chart_groupby );
$order_item_counts = $this->prepare_chart_data( $order_items, 'post_date', 'order_item_count', $this->chart_interval, $this->start_date, $this->chart_groupby );
$order_amounts = $this->prepare_chart_data( $orders, 'post_date', 'total_sales', $this->chart_interval, $this->start_date, $this->chart_groupby );
$coupon_amounts = $this->prepare_chart_data( $coupons, 'post_date', 'discount_amount', $this->chart_interval, $this->start_date, $this->chart_groupby );
$shipping_amounts = $this->prepare_chart_data( $orders, 'post_date', 'total_shipping', $this->chart_interval, $this->start_date, $this->chart_groupby );
$refund_amounts = $this->prepare_chart_data( $refunds, 'post_date', 'total_refund', $this->chart_interval, $this->start_date, $this->chart_groupby );
// Encode in json format
$chart_data = json_encode( array(
'order_counts' => array_values( $order_counts ),
'order_item_counts' => array_values( $order_item_counts ),
'order_amounts' => array_values( $order_amounts ),
'coupon_amounts' => array_values( $coupon_amounts ),
'shipping_amounts' => array_values( $shipping_amounts ),
'refund_amounts' => array_values( $refund_amounts )
) );
?>
<div class="chart-container">
<div class="chart-placeholder main"></div>
</div>
<script type="text/javascript">
var main_chart;
jQuery(function(){
var order_data = jQuery.parseJSON( '<?php echo $chart_data; ?>' );
var drawGraph = function( highlight ) {
var series = [
{
label: "<?php echo esc_js( __( 'Number of items sold', 'woocommerce' ) ) ?>",
data: order_data.order_item_counts,
color: '<?php echo $this->chart_colours['item_count']; ?>',
bars: { fillColor: '<?php echo $this->chart_colours['item_count']; ?>', fill: true, show: true, lineWidth: 0, barWidth: <?php echo $this->barwidth; ?> * 0.5, align: 'center' },
shadowSize: 0,
hoverable: false
},
{
label: "<?php echo esc_js( __( 'Number of orders', 'woocommerce' ) ) ?>",
data: order_data.order_counts,
color: '<?php echo $this->chart_colours['order_count']; ?>',
bars: { fillColor: '<?php echo $this->chart_colours['order_count']; ?>', fill: true, show: true, lineWidth: 0, barWidth: <?php echo $this->barwidth; ?> * 0.5, align: 'center' },
shadowSize: 0,
hoverable: false
},
{
label: "<?php echo esc_js( __( 'Average sales amount', 'woocommerce' ) ) ?>",
data: [ [ <?php echo min( array_keys( $order_amounts ) ); ?>, <?php echo $this->average_sales; ?> ], [ <?php echo max( array_keys( $order_amounts ) ); ?>, <?php echo $this->average_sales; ?> ] ],
yaxis: 2,
color: '<?php echo $this->chart_colours['average']; ?>',
points: { show: false },
lines: { show: true, lineWidth: 2, fill: false },
shadowSize: 0,
hoverable: false
},
{
label: "<?php echo esc_js( __( 'Coupon amount', 'woocommerce' ) ) ?>",
data: order_data.coupon_amounts,
yaxis: 2,
color: '<?php echo $this->chart_colours['coupon_amount']; ?>',
points: { show: true, radius: 5, lineWidth: 3, fillColor: '#fff', fill: true },
lines: { show: true, lineWidth: 4, fill: false },
shadowSize: 0,
prepend_tooltip: "<?php echo get_woocommerce_currency_symbol(); ?>"
},
{
label: "<?php echo esc_js( __( 'Refund amount', 'woocommerce' ) ) ?>",
data: order_data.refund_amounts,
yaxis: 2,
color: '<?php echo $this->chart_colours['refund_amount']; ?>',
points: { show: true, radius: 5, lineWidth: 3, fillColor: '#fff', fill: true },
lines: { show: true, lineWidth: 4, fill: false },
shadowSize: 0,
prepend_tooltip: "<?php echo get_woocommerce_currency_symbol(); ?>"
},
{
label: "<?php echo esc_js( __( 'Shipping amount', 'woocommerce' ) ) ?>",
data: order_data.shipping_amounts,
yaxis: 2,
color: '<?php echo $this->chart_colours['shipping_amount']; ?>',
points: { show: true, radius: 5, lineWidth: 3, fillColor: '#fff', fill: true },
lines: { show: true, lineWidth: 4, fill: false },
shadowSize: 0,
prepend_tooltip: "<?php echo get_woocommerce_currency_symbol(); ?>"
},
{
label: "<?php echo esc_js( __( 'Sales amount', 'woocommerce' ) ) ?>",
data: order_data.order_amounts,
yaxis: 2,
color: '<?php echo $this->chart_colours['sales_amount']; ?>',
points: { show: true, radius: 5, lineWidth: 3, fillColor: '#fff', fill: true },
lines: { show: true, lineWidth: 4, fill: false },
shadowSize: 0,
prepend_tooltip: "<?php echo get_woocommerce_currency_symbol(); ?>"
foreach($submenu['woocommerce'] as $menuK => $menu){
if($menu[2] === $this->menu_slug ){
$submenu['woocommerce'][$menuK][0] .= "<span class='update-plugins count-1'><span class='update-count'>$this->status_count </span></span>";
}
}
}
];
if ( highlight !== 'undefined' && series[ highlight ] ) {
highlight_series = series[ highlight ];
highlight_series.color = '#9c5d90';
}
if ( highlight_series.bars )
highlight_series.bars.fillColor = '#9c5d90';
public function donation_orders_listing(){
global $wpdb;
$args = array( 'post_type' => 'shop_order', 'post_status' => array_keys(wc_get_order_statuses()),'post__in' => $this->donation_orderids );
$wp_query = new WP_Query($args);
require('wc_quick_donation_listing_table.php');
tt_render_list_page($wp_query);
}
if ( highlight_series.lines ) {
highlight_series.lines.lineWidth = 5;
private function get_status_count(){
foreach($this->donation_orderids as $id){
$order_status = get_post_status($id);
if($order_status == 'wc-on-hold' || $order_status == 'wc-processing'){
$this->status_count++;
}
}
main_chart = jQuery.plot(
jQuery('.chart-placeholder.main'),
series,
{
legend: {
show: false
},
grid: {
color: '#aaa',
borderColor: 'transparent',
borderWidth: 0,
hoverable: true
},
xaxes: [ {
color: '#aaa',
position: "bottom",
tickColor: 'transparent',
mode: "time",
timeformat: "<?php if ( $this->chart_groupby == 'day' ) echo '%d %b'; else echo '%b'; ?>",
monthNames: <?php echo json_encode( array_values( $wp_locale->month_abbrev ) ) ?>,
tickLength: 1,
minTickSize: [1, "<?php echo $this->chart_groupby; ?>"],
font: {
color: "#aaa"
return $this->status_count;
}
} ],
yaxes: [
{
min: 0,
minTickSize: 1,
tickDecimals: 0,
color: '#d4d9dc',
font: { color: "#aaa" }
},
{
position: "right",
min: 0,
tickDecimals: 2,
alignTicksWithAxis: 1,
color: 'transparent',
font: { color: "#aaa" }
private function generate_data(){
foreach($this->donation_orderids as $id){
$order_details = $this->get_order_info($id);
$order_meta = $this->get_order_meta($id);
$order_info = array_merge($order_details,$order_meta);
unset($order_details,$order_meta);
$user_details = $this->get_user_info($order_info['by_user']);
$order = array_merge($order_info,$user_details);
}
],
}
);
jQuery('.chart-placeholder').resize();
/* private function _generate_data(){
require(wc_qd_p.'views/report_tbl_header.php');
global $i;
$i = 1;
foreach($this->donation_orderids as $id){
$order_details = $this->get_order_info($id);
$order_meta = $this->get_order_meta($id);
$order_info = array_merge($order_details,$order_meta);
unset($order_details,$order_meta);
$user_details = $this->get_user_info($order_info['by_user']);
global $order;
$order = array_merge($order_info,$user_details);
require(wc_qd_p.'views/report_tbl_content.php');
$i++;
}
require(wc_qd_p.'views/report_tbl_footer.php');
}*/
drawGraph();
/**
* Gets Order Details
* @param INT $id Order Post ID
* @returns [[Type]] [[Description]]
*/
private function get_order_info($id){
global $wc_quick_donation;
$return_details = array();
$order = new WC_Order($id);
$items = $order->get_items();
$order_details = $order->post;
foreach($items as $item){
if($wc_quick_donation->donation_id == $item['product_id']){
$return_details['amount'] = floatval($item['item_meta']['_line_total'][0]);
}
}
$return_details['ID'] = $order_details->ID;
$return_details['by_user'] = $order->user_id;
$return_details['date_gmt'] = $order_details->post_date_gmt;
$return_details['date'] = $order_details->post_date;
$return_details['address'] = $order->get_formatted_billing_address();
unset($order);
return $return_details;
}
jQuery('.highlight_series').hover(
function() {
drawGraph( jQuery(this).data('series') );
},
function() {
drawGraph();
/**
* Gets Order Meta Data Like pay_method, currency
* @param [[Type]] $id [[Description]]
* @since 1.0
*/
private function get_order_meta($id){
$return_details = array();
$meta = get_post_meta($id);
$return_details['currency'] = $meta['_order_currency'][0];
$return_details['pay_method'] = $meta['_payment_method'][0];
$return_details['pay_method_title'] = $meta['_payment_method_title'][0];
$return_details['order_amount'] = $meta['_order_total'][0];
#$return_details['project_details'] = $meta['project_details'];
#$return_details['is_donation'] = $meta['is_donation'];
unset($meta);
return $return_details;
}
);
});
</script>
<?php
/**
* Gets User Info By User ID
* @param USERID $id
* @returns Array User INFO
* @since 1.0
*/
private function get_user_info($id){
$return_details = array();
$user = get_user_by('id',$id);
$userM = get_user_meta($id);
$return_details['uname'] = $user->data->user_login;
$return_details['email'] = $user->data->user_email;
$return_details['dname'] = $user->data->display_name;
$return_details['nickname'] = $userM['nickname'][0];
$return_details['fname'] = $userM['first_name'][0];
$return_details['lname'] = $userM['last_name'][0];
unset($user,$userM);
return $return_details;
}
}
new wc_quick_donation_report;
?>
\ No newline at end of file
......@@ -5,14 +5,11 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
* Constructor
*/
public function __construct() {
$this->id = 'wc_quick_donation';
add_filter( 'woocommerce_settings_tabs_array', array( $this, 'add_settings_tab' ), 50 );
add_action( 'woocommerce_sections_' . $this->id, array( $this, 'output_sections' ) );
add_action( 'woocommerce_settings_' . $this->id, array( $this, 'output' ) );
add_action( 'woocommerce_settings_save_' . $this->id, array( $this, 'save' ) );
}
/**
......@@ -29,17 +26,18 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
* Get sections
*
* @return array
*/
public function get_sections() {
$sections = array(
'general' => __( 'General Settings', $this->id )
'general' => __( 'General Settings', $this->id ),
'donation' => __( 'Donation Settings', $this->id ),
'message' => __( 'Message Settings', $this->id )
);
return apply_filters( 'woocommerce_get_sections_' . $this->id, $sections );
}
*/
/**
* Get sections
......@@ -47,7 +45,9 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
* @return array
*/
public function get_settings( $section = null ) {
global $wc_quick_buy;
global $wc_quick_donation;
$width = "width:50% !important;";
switch( $section ){
case 'general' :
......@@ -59,7 +59,7 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
'desc' => 'Just Call <code><strong>[wc_quick_donation]</strong></code> short code any where in your page,post,widgets or template <br/>
To Customize the <strong>Donation Form</strong> copy the template file from <code>woocommerce-quick-donation/template/donation_form.php</code> to your <code>theme/woocommerce</code> folder.
',
'id' => 'wc_quick_donation_section_title'
'id' => 'wc_quick_donation_general_start'
),
'remove_cart_items' => array(
......@@ -68,6 +68,7 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
'id' => 'wc_quick_donation_cart_remove',
'type' => 'select',
'class' =>'chosen_select',
'css' => $width,
'options' => array('false' => 'Keep All Items','true'=>'Remove All Items')
),
......@@ -78,6 +79,7 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
'id' => 'wc_quick_donation_redirect',
'type' => 'select',
'class' =>'chosen_select',
'css' => $width,
'options' => array('checkout' => 'Checkout Page','cart'=>'Cart Page','false' => 'None')
),
......@@ -88,20 +90,54 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
'id' => 'wc_quick_donation_payment_gateway',
'type' => 'multiselect',
'class' =>'chosen_select',
'options' => $wc_quick_buy->get_payments_gateway()
'css' => $width,
'options' => $wc_quick_donation->get_payments_gateway()
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_quick_donation_general_end'
)
);
break;
case 'donation' :
$settings = array(
'section_title' => array(
'name' => 'Donation Releated Settings',
'type' => 'title',
'desc' => '',
'id' => 'wc_quick_donation_donation_start'
),
'project_names' => array(
'name' => 'Project Names',
'type' => 'textarea',
'desc' => 'Add Names By <code>,</code> Seperated ',
'desc_tip' => 'Add Names By <code>,</code> Seperated ',
'css' => 'width:50%; height: 105px;',
'std' => '', // for woocommerce < 2.0
'id' => 'wc_quick_donation_projects',
'default' => 'Project1,Project2'
'default' => 'Project1,Project2' // for woocommerce >= 2.0
),
'min_required_donation' => array(
'name' => 'Minium Required Amount',
'type' => 'text',
'desc' => 'Minium Required Amount For Donation. Enter Only Numerical Eg : 100',
'id' => 'wc_quick_donation_min_required_donation',
'default' =>'50'
),
'max_required_donation' => array(
'name' => 'Maximum Allowed Amount',
'type' => 'text',
'desc' => 'Maximum Allowed Amount For Donation. Enter Only Numerical Eg : 1000',
'id' => 'wc_quick_donation_max_required_donation',
'default' =>'1000'
),
'order_project_title' => array(
'name' => 'Order Project Title',
'type' => 'text',
'desc' => 'Title to view in order edit page',
'desc_tip' => 'Title to view in order edit page',
'css' => $width,
'id' => 'wc_quick_donation_project_section_title',
'default' =>'For Project'
......@@ -109,16 +145,79 @@ class WC_Quick_Donation_Settings extends WC_Settings_Page {
'order_notes_title' => array(
'name' => 'Order Notes Title',
'type' => 'text',
'desc' => 'to display project name use <code>Project Name : %s</code>',
'desc_tip' => 'to display project name use <code>Project Name : %s</code>',
'id' => 'wc_quick_donation_order_notes_title',
'css' => $width,
'default' =>'Project Name %s'
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_settings_tab_demo_section_end'
'id' => 'wc_quick_donation_donation_end'
)
);
break;
case 'message' :
$settings = array(
'section_title' => array(
'name' => 'Plugin Message Text',
'type' => 'title',
'desc' => '',
'id' => 'wc_quick_donation_message_start'
),
'project_invalid_message' => array(
'name' => 'Invalid / No Project Selected',
'type' => 'textarea',
'desc_tip' => 'Message Displayed When No Project Is Selected | HTML Tags Allowed',
'css' => 'width:75%; height:75px;',
'id' => 'wc_quick_donation_msg_project_invalid',
'default' =>'<h2> No Project Selected </h2>'
),
'donation_amount_empty_message' => array(
'name' => 'Empty Donation Amount',
'type' => 'textarea',
'desc_tip' => 'Message Displayed When No Donation Entered | HTML Tags Allowed',
'css' => 'width:75%; height:75px;',
'id' => 'wc_quick_donation_msg_amount_empty',
'default' =>'<h2> Please Enter A Donation Amount </h2>'
),
'donation_amount_invalid_message' => array(
'name' => 'Invalid Donation Amount',
'type' => 'textarea',
'desc_tip' => 'Message Displayed When Invalid Donation Entered | HTML Tags Allowed',
'desc' => 'Add <code>{donation_amount}</code> For Entered Donation Amount',
'css' => 'width:75%; height:75px;',
'id' => 'wc_quick_donation_msg_amount_invalid',
'default' =>'<h2> Invalid Donation Amount [{donation_amount}] </h2>'
),
'donation_min_required' => array(
'name' => 'Minium Required Donation Amount',
'type' => 'textarea',
'desc_tip' => 'Message Displayed When Donation Amount Is Less than required amount | HTML Tags Allowed',
'desc' => 'Add <code>{donation_amount}</code> For Entered Donation Amount And Add <code>{min_amount}</code> For Minium Required Amount ',
'css' => 'width:75%; height:75px;',
'id' => 'wc_quick_donation_msg_amount_min_required',
'default' =>'<h2> Minium Required is {min_amount} And you have entered is {donation_amount} </h2>'
),
'donation_max_allowed' => array(
'name' => 'Maximum Allowed Donation Amount',
'type' => 'textarea',
'desc_tip' => 'Message Displayed When Donation Amount Is Greater than allowed amount | HTML Tags Allowed',
'desc' => 'Add <code>{donation_amount}</code> For Entered Donation Amount And Add <code>{max_amount}</code> For Maximum Allowed Amount ',
'css' => 'width:75%; height:75px;',
'id' => 'wc_quick_donation_msg_amount_max_allowed',
'default' =>'<h2> Maximum Allowed Is {max_amount} And you have entered is {donation_amount} </h2>'
),
'section_end' => array(
'type' => 'sectionend',
'id' => 'wc_quick_donation_message_end'
)
);
break;
}
......
......@@ -17,7 +17,7 @@
Plugin Name: Woocommerce Quick Donation
Plugin URI: http://varunsridharan.in/
Description: Woocommerce Quick Donation
Version: 0.4
Version: 1.0
Author: Varun Sridharan
Author URI: http://varunsridharan.in/
License: GPL2
......@@ -28,23 +28,31 @@ define( 'wc_qd_p', plugin_dir_path( __FILE__ ) );
class wc_quick_donation{
private $donation_id;
public $donation_id;
private $plugin_v;
/**
* Setup The Plugin Class
*/
function __construct() {
$this->donation_id = get_option('wc_quick_donation_product_id');
$this->plugin_v = '1.0';
add_shortcode( 'wc_quick_donation', array($this,'shortcode_handler' ));
add_action( 'post_row_actions', array($this,'protect_donation_product'),99,2);
add_action( 'get_the_generator_html', array($this,'generate_meta_tags'), 15, 2 );
add_action( 'get_the_generator_xhtml', array($this,'generate_meta_tags'), 15, 2 );
add_action( 'wp_loaded',array($this,'process_donation'));
add_action( 'wc_qd_show_projects_list',array($this,'get_projects_list'));
add_action( 'woocommerce_checkout_update_order_meta', array($this,'add_order_meta'));
add_action( 'woocommerce_available_payment_gateways',array($this,'remove_gateway'));
add_action( 'woocommerce_checkout_update_order_meta', array($this,'save_order_id_db'));
add_action( 'woocommerce_add_order_item_meta', array($this,'add_order_meta'),99,3);
add_action( 'woocommerce_admin_order_data_after_billing_address', array($this,'custom_order_details_page_info'), 10, 1 );
add_action( 'woocommerce_available_payment_gateways',array($this,'remove_gateway'));
add_filter('woocommerce_hidden_order_itemmeta',array($this,'hide_core_fields'));
add_filter( 'woocommerce_get_price', array($this,'get_price'),10,2);
add_filter( 'woocommerce_get_settings_pages', array($this,'settings_page') );
add_filter( 'woocommerce_email_classes', array($this,'email_classes'));
......@@ -60,15 +68,27 @@ class wc_quick_donation{
public function generate_meta_tags( $gen, $type ) {
switch ( $type ) {
case 'html':
$gen .= "\n" . '<meta name="generator" content="WooCommerce Quick Donation 0.4">';
$gen .= "\n" . '<meta name="generator" content="WooCommerce Quick Donation '.$this->plugin_v.'">';
break;
case 'xhtml':
$gen .= "\n" . '<meta name="generator" content="WooCommerce Quick Donation 0.4" />';
$gen .= "\n" . '<meta name="generator" content="WooCommerce Quick Donation '.$this->plugin_v.'" />';
break;
}
return $gen;
}
/**
* Hides Some Important Fields
* @since 1.0
* @param [[Type]] $fields [[Description]]
* @returns [[Type]] [[Description]]
*/
public function hide_core_fields($fields){
$fields[] = '_is_donation';
$fields[] = '_project_details';
return $fields;
}
/**
* Adds Settings Page
*/
......@@ -91,27 +111,47 @@ class wc_quick_donation{
/**
* Adds Donation Order Meta. [Project Name]
* @param [[Type]] $order_id [[Description]]
* @since 0.2
* @updated 1.0
*/
public function add_order_meta( $order_id ) {
public function add_order_meta( $item_id, $values, $cart_item_key) {
if($this->donation_id == $values['product_id']){
global $woocommerce;
update_post_meta( $order_id, 'project_details',$woocommerce->session->projects);
update_post_meta( $order_id, 'is_donation','yes');
wc_add_order_item_meta( $item_id, "_project_details",$woocommerce->session->projects);
wc_add_order_item_meta( $item_id, "_is_donation",'yes');
}
}
/**
* Saves Donation Order ID and adds order notes...
* @param [[Type]] $order_id [[Description]]
* @since 1.0
* @adopedFrom add_order_meta
*/
public function save_order_id_db($order_id){
$order = new WC_Order($order_id);
$items = $order->get_items();
foreach($items as $item){
$order_product_id = floatval($item['product_id']);
if($this->donation_id == $order_product_id){
$this->update_order_id($order_id);
$format = sprintf(get_option('wc_quick_donation_order_notes_title'), $woocommerce->session->projects);
$order->add_order_note($format);
update_post_meta($order_id,'_is_donation',true);
}
}
unset($order);
$this->update_order_id($order_id);
return $order_id;
}
/**
* Updates Order ID to [wc_quick_donation_orders] when donation is ordered
* Updates Order ID to [wc_quick_donation_ids] when donation is ordered
* @param [int] $order_id [Donation Order ID]
* @since 1.0
*/
private function update_order_id($order_id){
$ordersID = get_option('wc_quick_donation_orders');
$ordersID = get_option('wc_quick_donation_ids');
$save_order_id = array();
if(empty($ordersID)){
$save_order_id[] = $order_id;
......@@ -119,7 +159,7 @@ class wc_quick_donation{
$save_order_id = json_decode($ordersID,true);
$save_order_id[] = $order_id;
}
update_option('wc_quick_donation_orders',json_encode($save_order_id));
update_option('wc_quick_donation_ids',json_encode($save_order_id));
}
......@@ -128,7 +168,12 @@ class wc_quick_donation{
* @since 1.0
*/
public function custom_order_details_page_info($order){
echo '<p><strong>'.get_option('wc_quick_donation_project_section_title').' :</strong>'.get_post_meta( $order->id, 'project_details', true ) . '</p>';
$is_donation = wc_get_order_item_meta($order->id, '_is_donation');
if($is_donation === true){
echo '<p><strong>'.get_option('wc_quick_donation_project_section_title').' :</strong>'.wc_get_order_item_meta($order->id, '_project_details') . '</p>';
}
}
......@@ -205,20 +250,43 @@ class wc_quick_donation{
if(isset($_POST['donation_add'])){
$error = 0;
$found = false;
$donation = isset($_POST['donation_ammount']) && !empty($_POST['donation_ammount']) ? floatval($_POST['donation_ammount']) : false;
$donation = isset($_POST['donation_ammount']) ? $_POST['donation_ammount'] : false;
$projects = isset($_POST['projects']) && !empty($_POST['projects']) ? $_POST['projects'] : false;
$_SESSION['wc_qd_projects'] = $projects;
$min = get_option('wc_quick_donation_min_required_donation');
$max = get_option('wc_quick_donation_max_required_donation');
if(!$donation){
wc_add_notice('Invalid Donation Ammount', 'error' );
if(isset($_POST['projects']) && $_POST['projects'] == '' ){
wc_add_notice(get_option('wc_quick_donation_msg_project_invalid'), 'error' );
$error += 1;
}
if(isset($_POST['projects']) && $_POST['projects'] == '' ){
wc_add_notice('Please Select A Project', 'error' );
if(! empty($donation)){
$donate_price = floatval($donation);
if($donate_price != 0 || $donate_price != null){
if($donate_price < $min){
$message = str_replace(array('{donation_amount}','{min_amount}'),array($donation,$min),get_option('wc_quick_donation_msg_amount_min_required'));
wc_add_notice($message, 'error' );
$error += 1;
}
if($donate_price > $max){
$message = str_replace(array('{donation_amount}','{max_amount}'),array($donation,$max),get_option('wc_quick_donation_msg_amount_max_allowed'));
wc_add_notice($message, 'error' );
$error += 1;
}
} else {
$message = str_replace('{donation_amount}',$donation,get_option('wc_quick_donation_msg_amount_invalid'));
wc_add_notice($message, 'error' );
$error += 1;
}
} else {
wc_add_notice(get_option('wc_quick_donation_msg_amount_empty'), 'error' );
$error += 1;
}
if($error ==0 ) {
if($donation >= 0){
$woocommerce->session->jc_donation = $donation;
......@@ -357,16 +425,45 @@ class wc_quick_donation{
*/
public static function install() {
$exist = get_option('wc_quick_donation_product_id');
if($exist){
if ( get_post_status ( $exist ) ) {
return true;
} else {
$post_id = create_donation();
add_option('wc_quick_donation_product_id',$post_id);
add_option('wc_quick_donation_orders','');
add_site_option( 'wc_quick_donation_product_id', $post_id) ;
}
} else {
$post_id = create_donation();
add_option('wc_quick_donation_product_id',$post_id);
add_option('wc_quick_donation_ids','');
add_site_option( 'wc_quick_donation_product_id', $post_id) ;
}
}
/**
* Protects Donation Product By
* @filter_user post_row_actions
* @param Array $actions Refer WP.org
* @param Array $post Refer WP.org
* @return Array Refer WP.org
* @since 1.0
*/
public function protect_donation_product($actions,$post) {
if('product' == $post->post_type) {
if($post->ID == $this->donation_id){
unset($actions['inline hide-if-no-js']);
unset($actions['trash']);
unset($actions['duplicate']);
$actions['trash'] = '<a href="javascript:alert(\'Remove Woocommerce Quick Donation Plugin To Remove This Product \');"> Trash </a>';
}
}
return $actions;
}
}
......@@ -391,7 +488,6 @@ function create_donation(){
update_post_meta($post_id, '_stock', '');
update_post_meta($post_id, '_virtual', 'yes');
update_post_meta($post_id, '_featured', 'no');
update_post_meta($post_id, '_manage_stock', "no" );
update_post_meta($post_id, '_sold_individually', "yes" );
update_post_meta($post_id, '_sku', 'checkout-donation');
......@@ -404,7 +500,8 @@ function create_donation(){
*/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
register_activation_hook( __FILE__, array( 'wc_quick_donation', 'install' ) );
$wc_quick_buy = new wc_quick_donation;
$wc_quick_donation = new wc_quick_donation;
require(wc_qd_p.'woocommerce-quick-donation-report.php');
} else {
add_action( 'admin_notices', 'wc_quick_donation_notice' );
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment