Add files via upload
This commit is contained in:
commit
f70818ae9e
|
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
=== Plugin Name ===
|
||||
Contributors: (this should be a list of wordpress.org userid's)
|
||||
Donate link: http://abdulwahab.live/
|
||||
Tags: comments, spam
|
||||
Requires at least: 3.0.1
|
||||
Tested up to: 3.4
|
||||
Stable tag: 4.3
|
||||
License: GPLv2 or later
|
||||
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
||||
|
||||
Here is a short description of the plugin. This should be no more than 150 characters. No markup here.
|
||||
|
||||
== Description ==
|
||||
|
||||
This is the long description. No limit, and you can use Markdown (as well as in the following sections).
|
||||
|
||||
For backwards compatibility, if this section is missing, the full length of the short description will be used, and
|
||||
Markdown parsed.
|
||||
|
||||
A few notes about the sections above:
|
||||
|
||||
* "Contributors" is a comma separated list of wp.org/wp-plugins.org usernames
|
||||
* "Tags" is a comma separated list of tags that apply to the plugin
|
||||
* "Requires at least" is the lowest version that the plugin will work on
|
||||
* "Tested up to" is the highest version that you've *successfully used to test the plugin*. Note that it might work on
|
||||
higher versions... this is just the highest one you've verified.
|
||||
* Stable tag should indicate the Subversion "tag" of the latest stable version, or "trunk," if you use `/trunk/` for
|
||||
stable.
|
||||
|
||||
Note that the `readme.txt` of the stable tag is the one that is considered the defining one for the plugin, so
|
||||
if the `/trunk/readme.txt` file says that the stable tag is `4.3`, then it is `/tags/4.3/readme.txt` that'll be used
|
||||
for displaying information about the plugin. In this situation, the only thing considered from the trunk `readme.txt`
|
||||
is the stable tag pointer. Thus, if you develop in trunk, you can update the trunk `readme.txt` to reflect changes in
|
||||
your in-development version, without having that information incorrectly disclosed about the current stable version
|
||||
that lacks those changes -- as long as the trunk's `readme.txt` points to the correct stable tag.
|
||||
|
||||
If no stable tag is provided, it is assumed that trunk is stable, but you should specify "trunk" if that's where
|
||||
you put the stable version, in order to eliminate any doubt.
|
||||
|
||||
== Installation ==
|
||||
|
||||
This section describes how to install the plugin and get it working.
|
||||
|
||||
e.g.
|
||||
|
||||
1. Upload `coupon-manager.php` to the `/wp-content/plugins/` directory
|
||||
1. Activate the plugin through the 'Plugins' menu in WordPress
|
||||
1. Place `<?php do_action('plugin_name_hook'); ?>` in your templates
|
||||
|
||||
== Frequently Asked Questions ==
|
||||
|
||||
= A question that someone might have =
|
||||
|
||||
An answer to that question.
|
||||
|
||||
= What about foo bar? =
|
||||
|
||||
Answer to foo bar dilemma.
|
||||
|
||||
== Screenshots ==
|
||||
|
||||
1. This screen shot description corresponds to screenshot-1.(png|jpg|jpeg|gif). Note that the screenshot is taken from
|
||||
the /assets directory or the directory that contains the stable readme.txt (tags or trunk). Screenshots in the /assets
|
||||
directory take precedence. For example, `/assets/screenshot-1.png` would win over `/tags/4.3/screenshot-1.png`
|
||||
(or jpg, jpeg, gif).
|
||||
2. This is the second screen shot
|
||||
|
||||
== Changelog ==
|
||||
|
||||
= 1.0 =
|
||||
* A change since the previous version.
|
||||
* Another change.
|
||||
|
||||
= 0.5 =
|
||||
* List versions from most recent at top to oldest at bottom.
|
||||
|
||||
== Upgrade Notice ==
|
||||
|
||||
= 1.0 =
|
||||
Upgrade notices describe the reason a user should upgrade. No more than 300 characters.
|
||||
|
||||
= 0.5 =
|
||||
This version fixes a security related bug. Upgrade immediately.
|
||||
|
||||
== Arbitrary section ==
|
||||
|
||||
You may provide arbitrary sections, in the same format as the ones above. This may be of use for extremely complicated
|
||||
plugins where more information needs to be conveyed that doesn't fit into the categories of "description" or
|
||||
"installation." Arbitrary sections will be shown below the built-in sections outlined above.
|
||||
|
||||
== A brief Markdown Example ==
|
||||
|
||||
Ordered list:
|
||||
|
||||
1. Some feature
|
||||
1. Another feature
|
||||
1. Something else about the plugin
|
||||
|
||||
Unordered list:
|
||||
|
||||
* something
|
||||
* something else
|
||||
* third thing
|
||||
|
||||
Here's a link to [WordPress](http://wordpress.org/ "Your favorite software") and one to [Markdown's Syntax Documentation][markdown syntax].
|
||||
Titles are optional, naturally.
|
||||
|
||||
[markdown syntax]: http://daringfireball.net/projects/markdown/syntax
|
||||
"Markdown is what the parser uses to process much of the readme file"
|
||||
|
||||
Markdown uses email style notation for blockquotes and I've been told:
|
||||
> Asterisks for *emphasis*. Double it up for **strong**.
|
||||
|
||||
`<?php code(); // goes in backticks ?>`
|
||||
|
|
@ -0,0 +1,238 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The admin-specific functionality of the plugin.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/admin
|
||||
*/
|
||||
|
||||
/**
|
||||
* The admin-specific functionality of the plugin.
|
||||
*
|
||||
* Defines the plugin name, version, and two examples hooks for how to
|
||||
* enqueue the admin-specific stylesheet and JavaScript.
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/admin
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager_Admin {
|
||||
|
||||
/**
|
||||
* The ID of this plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
* @var string $plugin_name The ID of this plugin.
|
||||
*/
|
||||
private $plugin_name;
|
||||
|
||||
/**
|
||||
* The version of this plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
* @var string $version The current version of this plugin.
|
||||
*/
|
||||
private $version;
|
||||
|
||||
/**
|
||||
* Initialize the class and set its properties.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @param string $plugin_name The name of this plugin.
|
||||
* @param string $version The version of this plugin.
|
||||
*/
|
||||
public function __construct( $plugin_name, $version ) {
|
||||
|
||||
$this->plugin_name = $plugin_name;
|
||||
$this->version = $version;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the stylesheets for the admin area.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function enqueue_styles() {
|
||||
|
||||
/**
|
||||
* This function is provided for demonstration purposes only.
|
||||
*
|
||||
* An instance of this class should be passed to the run() function
|
||||
* defined in Coupon_Manager_Loader as all of the hooks are defined
|
||||
* in that particular class.
|
||||
*
|
||||
* The Coupon_Manager_Loader will then create the relationship
|
||||
* between the defined hooks and the functions defined in this
|
||||
* class.
|
||||
*/
|
||||
|
||||
wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/coupon-manager-admin.css', array(), $this->version, 'all' );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the JavaScript for the admin area.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function enqueue_scripts() {
|
||||
|
||||
/**
|
||||
* This function is provided for demonstration purposes only.
|
||||
*
|
||||
* An instance of this class should be passed to the run() function
|
||||
* defined in Coupon_Manager_Loader as all of the hooks are defined
|
||||
* in that particular class.
|
||||
*
|
||||
* The Coupon_Manager_Loader will then create the relationship
|
||||
* between the defined hooks and the functions defined in this
|
||||
* class.
|
||||
*/
|
||||
|
||||
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/coupon-manager-admin.js', array( 'jquery' ), $this->version, false );
|
||||
|
||||
}
|
||||
|
||||
public function display_admin_page(){
|
||||
add_menu_page(
|
||||
'Coupon Manager',
|
||||
'Coupon Manager',
|
||||
'manage_options',
|
||||
'coupon-manager-admin',
|
||||
array($this, 'showCouponPage'),
|
||||
'',
|
||||
6
|
||||
);
|
||||
}
|
||||
|
||||
public function showCouponPage(){
|
||||
|
||||
include plugin_dir_path( __FILE__ ) . 'partials/coupon-manager-admin-display.php';
|
||||
// include plugins_url('coupon-manager/admin/partials/coupon-manager-admin-display.php');
|
||||
}
|
||||
|
||||
public function coupon_manager_settings_group(){
|
||||
|
||||
register_setting( 'coupon-manager-settings-group', 'thank_page_text_opt' );
|
||||
register_setting( 'coupon-manager-settings-group', 'background_image' );
|
||||
register_setting( 'coupon-manager-settings-group', 'limit_person_coupon' );
|
||||
register_setting( 'coupon-manager-settings-group', 'coupon_discount_amount' );
|
||||
register_setting( 'coupon-manager-settings-group', 'coupon_discount_type' );
|
||||
register_setting( 'coupon-manager-settings-group', 'coupon_expiry_date' );
|
||||
|
||||
register_setting( 'coupon-manager-style-group', 'copy_btn_text' );
|
||||
register_setting( 'coupon-manager-style-group', 'copy_btn_color' );
|
||||
register_setting( 'coupon-manager-style-group', 'copy_btn_size' );
|
||||
register_setting( 'coupon-manager-style-group', 'copy_btn_text_color' );
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function create_couponuser_cpt(){
|
||||
|
||||
$labels = array(
|
||||
'name' => _x( 'Coupon uses', 'Post Type General Name', 'textdomain' ),
|
||||
'singular_name' => _x( 'Coupon use', 'Post Type Singular Name', 'textdomain' ),
|
||||
'menu_name' => _x( 'Coupon uses', 'Admin Menu text', 'textdomain' ),
|
||||
);
|
||||
$args = array(
|
||||
'label' => __( 'Coupon Uses', 'textdomain' ),
|
||||
'description' => __( '', 'textdomain' ),
|
||||
'labels' => $labels,
|
||||
'supports' => array('title', 'editor', 'excerpt', 'author', 'page-attributes', 'post-formats', 'custom-fields'),
|
||||
'taxonomies' => array(),
|
||||
'public' => true,
|
||||
'show_ui' => true,
|
||||
'show_in_menu' => true,
|
||||
'menu_position' => 5,
|
||||
'show_in_admin_bar' => true,
|
||||
'show_in_nav_menus' => true,
|
||||
'can_export' => true,
|
||||
'has_archive' => true,
|
||||
'hierarchical' => true,
|
||||
'exclude_from_search' => false,
|
||||
'show_in_rest' => true,
|
||||
'publicly_queryable' => true,
|
||||
'capability_type' => 'post',
|
||||
);
|
||||
register_post_type( 'couponuser', $args );
|
||||
}
|
||||
public function add_coupon_uses_meta()
|
||||
{
|
||||
add_meta_box(
|
||||
|
||||
'coupon_users',
|
||||
'Coupon Users',
|
||||
[ self::class, 'coupon_uses_custom_box_html' ],
|
||||
// 'coupon_uses_custom_box_html',
|
||||
'couponuser',
|
||||
'normal',
|
||||
'high');
|
||||
|
||||
}
|
||||
public static function coupon_uses_custom_box_html( $post ) {
|
||||
|
||||
$get_post_meta = get_post_meta(get_the_ID());
|
||||
// echo '<pre>';
|
||||
// print_r($get_post_meta);
|
||||
// echo '</pre>';
|
||||
?>
|
||||
|
||||
<div class="">
|
||||
<label class="">Coupon User Name</label>
|
||||
<input class="" type="text" name="coupon_user_name" value="<?= $get_post_meta['username'][0]; ?>">
|
||||
</div>
|
||||
<div class="">
|
||||
<label class="">Coupon Giver Name</label>
|
||||
<input type="text" name="coupon_giver_name" value="<?= get_post_meta( $post->ID,'giver_name',true); ?>">
|
||||
</div>
|
||||
<div class="">
|
||||
<label class="">Coupon Giver Email</label>
|
||||
<input type="text" name="coupon_giver_email" value="<?= get_post_meta( $post->ID,'giver_email',true); ?>">
|
||||
</div>
|
||||
|
||||
<?php
|
||||
}
|
||||
public function coupon_uses_save_postdata( $post_id ) {
|
||||
|
||||
|
||||
if(array_key_exists('coupon_user_name', $_POST)){
|
||||
update_post_meta(
|
||||
$post_id,
|
||||
'coupon_user_name',
|
||||
$_POST['coupon_user_name']
|
||||
);
|
||||
}
|
||||
|
||||
if(array_key_exists('coupon_giver_name', $_POST)){
|
||||
update_post_meta(
|
||||
$post_id,
|
||||
'coupon_giver_name',
|
||||
$_POST['coupon_giver_name']
|
||||
);
|
||||
}
|
||||
if(array_key_exists('coupon_giver_email', $_POST)){
|
||||
update_post_meta(
|
||||
$post_id,
|
||||
'coupon_giver_email',
|
||||
$_POST['coupon_giver_email']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public function admin_notice() {
|
||||
$class = 'notice notice-error';
|
||||
$message = __( 'Please activate license to use Coupon Manager Plugin!', 'sample-text-domain' );
|
||||
|
||||
printf( '<div class="%1$s"><p>%2$s <a href="'.admin_url("admin.php?page=license").'">Click to Activate.</a></p></div>', esc_attr( $class ), esc_html( $message ) );
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* All of the CSS for your admin-specific functionality should be
|
||||
* included in this file.
|
||||
*/
|
||||
|
|
@ -0,0 +1 @@
|
|||
<?php // Silence is golden
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
(function( $ ) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* All of the code for your admin-facing JavaScript source
|
||||
* should reside in this file.
|
||||
*
|
||||
* Note: It has been assumed you will write jQuery code here, so the
|
||||
* $ function reference has been prepared for usage within the scope
|
||||
* of this function.
|
||||
*
|
||||
* This enables you to define handlers, for when the DOM is ready:
|
||||
*
|
||||
* $(function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* When the window is loaded:
|
||||
*
|
||||
* $( window ).load(function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* ...and/or other possibilities.
|
||||
*
|
||||
* Ideally, it is not considered best practise to attach more than a
|
||||
* single DOM-ready or window-load handler for a particular page.
|
||||
* Although scripts in the WordPress core, Plugins and Themes may be
|
||||
* practising this, we should strive to set a better example in our own work.
|
||||
*/
|
||||
|
||||
})( jQuery );
|
||||
|
|
@ -0,0 +1,205 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Provide a admin area view for the plugin
|
||||
*
|
||||
* This file is used to markup the admin-facing aspects of the plugin.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/admin/partials
|
||||
*/
|
||||
?>
|
||||
|
||||
<!-- This file should primarily consist of HTML with a little bit of PHP. -->
|
||||
<?php
|
||||
$default_tab = null;
|
||||
$tab = isset($_GET['tab']) ? $_GET['tab'] : $default_tab;
|
||||
|
||||
?>
|
||||
<!-- Our admin page content should all be inside .wrap -->
|
||||
<div class="wrap">
|
||||
|
||||
<!-- Here are our tabs -->
|
||||
<nav class="nav-tab-wrapper">
|
||||
<a href="?page=coupon-manager-admin" class="nav-tab <?php if($tab===null):?>nav-tab-active<?php endif; ?>">General</a>
|
||||
<a href="?page=coupon-manager-admin&tab=style" class="nav-tab <?php if($tab==='style'):?>nav-tab-active<?php endif; ?>">Style</a>
|
||||
</nav>
|
||||
|
||||
<div class="tab-content">
|
||||
<?php switch($tab) :
|
||||
case 'style':
|
||||
?>
|
||||
<h2>Coupon manager styles</h2>
|
||||
<form method="post" action="options.php">
|
||||
<?php settings_fields( 'coupon-manager-style-group' ); ?>
|
||||
<?php do_settings_sections( 'coupon-manager-style-group' );
|
||||
|
||||
?>
|
||||
<table class="form-table">
|
||||
<tr valign="top">
|
||||
<th scope="row">Button Text</th>
|
||||
<td><input type="text" name="copy_btn_text" value="<?php echo esc_attr( get_option('copy_btn_text') ); ?>" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row">Button background color</th>
|
||||
<?php
|
||||
$btn_color = get_option('copy_btn_color');
|
||||
if(empty($btn_color)){
|
||||
$btn_color = '#0274be';
|
||||
}
|
||||
?>
|
||||
<td><input type="color" name="copy_btn_color" value="<?php echo $btn_color; ?>" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row">Button text color</th>
|
||||
<?php
|
||||
$btn_text_color = get_option('copy_btn_text_color');
|
||||
if(empty($btn_text_color)){
|
||||
$btn_text_color = '#ffffff';
|
||||
}
|
||||
?>
|
||||
<td><input type="color" name="copy_btn_text_color" value="<?php echo $btn_text_color; ?>" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row">Button Size</th>
|
||||
<td>
|
||||
<?php $selected_btn_size = get_option('copy_btn_size');
|
||||
?>
|
||||
<select name="copy_btn_size" id="copy_btn_size">
|
||||
<option value="copy_text_btn_sm" <?= $selected_btn_size == 'copy_text_btn_sm' ? ' selected="selected"' : ''; ?>>Small</option>
|
||||
<option value="copy_text_btn_md" <?= $selected_btn_size == 'copy_text_btn_md' ? ' selected="selected"' : ''; ?>>Medium</option>
|
||||
<option value="copy_text_btn_lg" <?= $selected_btn_size == 'copy_text_btn_lg' ? ' selected="selected"' : ''; ?>>large</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<?php submit_button(); ?>
|
||||
|
||||
</form>
|
||||
<?php
|
||||
break;
|
||||
default:
|
||||
|
||||
?>
|
||||
|
||||
<h1>Coupon Manager</h1>
|
||||
|
||||
|
||||
<form method="post" action="options.php">
|
||||
<?php settings_fields( 'coupon-manager-settings-group' ); ?>
|
||||
<?php do_settings_sections( 'coupon-manager-settings-group' );
|
||||
|
||||
wp_enqueue_media();
|
||||
|
||||
?>
|
||||
<table class="form-table">
|
||||
<tr valign="top">
|
||||
<th scope="row">Thank you page text</th>
|
||||
<td>
|
||||
<?php
|
||||
$thankyou_text = get_option('thank_page_text_opt');
|
||||
if(empty($thankyou_text)){
|
||||
$thankyou_text = '<h2>You have got a coupon</h2>
|
||||
|
||||
Your coupon is {coupon_code}.
|
||||
|
||||
Website Url is {site_url}.
|
||||
|
||||
Customer {first_name} {last_name}.
|
||||
|
||||
Business Name {business_name}.';
|
||||
}
|
||||
wp_editor($thankyou_text, 'thank_page_text_opt');
|
||||
?>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row">Background Image</th>
|
||||
<td><input type="text" id="background_image" name="background_image" value="<?php echo esc_attr( get_option('background_image') ); ?>" /><button type="button" id="choose_img">
|
||||
Choose Image
|
||||
</button></td>
|
||||
</tr>
|
||||
|
||||
<tr valign="top">
|
||||
<th scope="row">Person Limit</th>
|
||||
<td><input type="number" name="limit_person_coupon" value="<?php echo esc_attr( get_option('limit_person_coupon') ); ?>" /></td>
|
||||
</tr>
|
||||
|
||||
<tr valign="top">
|
||||
<th scope="row">Discount Amount</th>
|
||||
<td><input type="number" name="coupon_discount_amount" value="<?php echo esc_attr( get_option('coupon_discount_amount') ); ?>" /></td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row">Discount type</th>
|
||||
<td>
|
||||
<?php $selected_discount_type = get_option('coupon_discount_type');
|
||||
?>
|
||||
<select name="coupon_discount_type" id="coupon_discount_type">
|
||||
<option value="percent" <?= $selected_discount_type == 'percent' ? ' selected="selected"' : ''; ?>>Percentage discount</option>
|
||||
<option value="fixed_cart" <?= $selected_discount_type == 'fixed_cart' ? ' selected="selected"' : ''; ?>>Fixed cart discount</option>
|
||||
<!-- <option value="fixed_product" <?= $selected_discount_type == 'fixed_product' ? ' selected="selected"' : ''; ?>>Fixed product discount</option>-->
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<th scope="row">Coupon Expiry days</th>
|
||||
<td><input type="text" name="coupon_expiry_date" value="<?php echo esc_attr( get_option('coupon_expiry_date') ); ?>" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<?php submit_button(); ?>
|
||||
|
||||
</form>
|
||||
|
||||
<?php
|
||||
break;
|
||||
endswitch; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
//Get the active tab from the $_GET param
|
||||
$default_tab = null;
|
||||
$tab = isset($_GET['tab']) ? $_GET['tab'] : $default_tab;
|
||||
?>
|
||||
<script>
|
||||
|
||||
var wkMedia;
|
||||
jQuery(document).ready(function($){
|
||||
// Define a variable wkMedia
|
||||
var wkMedia;
|
||||
|
||||
$('#choose_img').click(function(e) {
|
||||
e.preventDefault();
|
||||
// If the upload object has already been created, reopen the dialog
|
||||
if (wkMedia) {
|
||||
wkMedia.open();
|
||||
return;
|
||||
}
|
||||
// Extend the wp.media object
|
||||
wkMedia = wp.media.frames.file_frame = wp.media({
|
||||
title: 'Select Image',
|
||||
button: {
|
||||
text: 'Select Image'
|
||||
}, multiple: false });
|
||||
|
||||
// When a file is selected, grab the URL and set it as the text field's value
|
||||
wkMedia.on('select', function() {
|
||||
var attachment = wkMedia.state().get('selection').first().toJSON();
|
||||
$('#background_image').val(attachment.url);
|
||||
});
|
||||
// Open the upload dialog
|
||||
wkMedia.open();
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The plugin bootstrap file
|
||||
*
|
||||
* This file is read by WordPress to generate the plugin information in the plugin
|
||||
* admin area. This file also includes all of the dependencies used by the plugin,
|
||||
* registers the activation and deactivation functions, and defines a function
|
||||
* that starts the plugin.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
* @package Coupon_Manager
|
||||
*
|
||||
* @wordpress-plugin
|
||||
* Plugin Name: Coupon Manager
|
||||
* Plugin URI: http://abdulwahab.live/coupon-manager
|
||||
* Description: This is a short description of what the plugin does. It's displayed in the WordPress admin area.
|
||||
* Version: 1.0.0
|
||||
* Author: Abdul Wahab
|
||||
* Author URI: http://abdulwahab.live/
|
||||
* License: GPL-2.0+
|
||||
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
||||
* Text Domain: coupon-manager
|
||||
* Domain Path: /languages
|
||||
*/
|
||||
|
||||
// If this file is called directly, abort.
|
||||
if ( ! defined( 'WPINC' ) ) {
|
||||
die;
|
||||
}
|
||||
define('DP_File', __FILE__ );
|
||||
define('DP_Version', '1.0.0' );
|
||||
define('DP_Author', 'Abdul Wahab' );
|
||||
define( 'EDD_STORE_URL', 'http://licenses-manager.com/' );
|
||||
define( 'EDD_ITEM_ID', 11 );
|
||||
/**
|
||||
* Currently plugin version.
|
||||
* Start at version 1.0.0 and use SemVer - https://semver.org
|
||||
* Rename this for your plugin and update it as you release new versions.
|
||||
*/
|
||||
define( 'COUPON_MANAGER_VERSION', 'DP_Version' );
|
||||
|
||||
/**
|
||||
* The code that runs during plugin activation.
|
||||
* This action is documented in includes/class-coupon-manager-activator.php
|
||||
*/
|
||||
function activate_coupon_manager() {
|
||||
require_once plugin_dir_path( __FILE__ ) . 'includes/class-coupon-manager-activator.php';
|
||||
Coupon_Manager_Activator::activate();
|
||||
}
|
||||
|
||||
/**
|
||||
* The code that runs during plugin deactivation.
|
||||
* This action is documented in includes/class-coupon-manager-deactivator.php
|
||||
*/
|
||||
function deactivate_coupon_manager() {
|
||||
require_once plugin_dir_path( __FILE__ ) . 'includes/class-coupon-manager-deactivator.php';
|
||||
Coupon_Manager_Deactivator::deactivate();
|
||||
}
|
||||
|
||||
register_activation_hook( __FILE__, 'activate_coupon_manager' );
|
||||
register_deactivation_hook( __FILE__, 'deactivate_coupon_manager' );
|
||||
|
||||
/**
|
||||
* The core plugin class that is used to define internationalization,
|
||||
* admin-specific hooks, and public-facing site hooks.
|
||||
*/
|
||||
require plugin_dir_path( __FILE__ ) . 'includes/class-coupon-manager.php';
|
||||
require plugin_dir_path( __FILE__ ) . 'domain-auction-edd.php';
|
||||
|
||||
/**
|
||||
* Begins execution of the plugin.
|
||||
*
|
||||
* Since everything within the plugin is registered via hooks,
|
||||
* then kicking off the plugin from this point in the file does
|
||||
* not affect the page life cycle.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
function run_coupon_manager() {
|
||||
|
||||
$plugin = new Coupon_Manager();
|
||||
$plugin->run();
|
||||
|
||||
}
|
||||
run_coupon_manager();
|
||||
|
||||
|
||||
// add_action("wp_footer",function(){
|
||||
// $site_url = get_site_url();
|
||||
// $result = wp_remote_get("http://licenses-manager.com/wp-json/coupon/tracking?coupon_generate=1&site_url=".$site_url);
|
||||
// var_dump($result);
|
||||
// exit;
|
||||
// if ( is_array( $result ) && ! is_wp_error( $result ) ) {
|
||||
// $headers = $result['headers']; // array of http header lines
|
||||
// $body = $result['body']; // use the content
|
||||
|
||||
|
||||
|
||||
// }
|
||||
// });
|
||||
|
|
@ -0,0 +1,330 @@
|
|||
<?php
|
||||
|
||||
define( 'EDD_PLUGIN_LICENSE_PAGE', 'license' );
|
||||
|
||||
if( !class_exists( 'EDD_SL_Plugin_Updater' ) ) {
|
||||
// load our custom updater
|
||||
include( dirname( __FILE__ ) . '/includes/EDD_SL_Plugin_Updater.php' );
|
||||
}
|
||||
|
||||
function dsp_plugin_updater() {
|
||||
|
||||
$active_plugins = get_option( 'active_plugins' );
|
||||
foreach ( $active_plugins as $active_plugin ) {
|
||||
if ( false !== strpos( $active_plugin, 'coupon-manager.php' ) ) {
|
||||
$plugin_dir_and_filename = $active_plugin;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( ! isset( $plugin_dir_and_filename ) || empty( $plugin_dir_and_filename ) ) {
|
||||
echo ( 'Plugin not found! Check the name of your plugin file in the if check above' );
|
||||
}
|
||||
// retrieve our license key from the DB
|
||||
$license_key = trim( get_option( 'edd_license_key' ) );
|
||||
|
||||
// setup the updater
|
||||
$edd_updater = new EDD_SL_Plugin_Updater( EDD_STORE_URL, DP_File ,
|
||||
array( // license key (used get_option above to retrieve from DB)
|
||||
'version' => DP_Version, // current version number
|
||||
'license' => $license_key, // license key (used get_option above to retrieve from DB)
|
||||
'item_id' => EDD_ITEM_ID, // ID of the product
|
||||
'author' => DP_Author, // author of this plugin
|
||||
'beta' => false,
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
add_action( 'admin_init', 'dsp_plugin_updater', 0 );
|
||||
|
||||
function edd_license_menu() {
|
||||
|
||||
add_submenu_page(
|
||||
'coupon-manager-admin',
|
||||
__( 'License', 'auctionsys' ),
|
||||
__( 'License', 'auctionsys' ),
|
||||
'manage_options',
|
||||
EDD_PLUGIN_LICENSE_PAGE,
|
||||
'edd_license_page'
|
||||
);
|
||||
|
||||
}
|
||||
add_action('admin_menu', 'edd_license_menu',99);
|
||||
|
||||
function edd_license_page() {
|
||||
$license = get_option( 'edd_license_key' );
|
||||
$status = get_option( 'edd_license_status' );
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h2><?php _e('Plugin License Options'); ?></h2>
|
||||
<form method="post" action="options.php">
|
||||
|
||||
<?php settings_fields('edd_license'); ?>
|
||||
|
||||
<table class="form-table">
|
||||
<tbody>
|
||||
<tr valign="top">
|
||||
<th scope="row" valign="top">
|
||||
<?php _e('License Key'); ?>
|
||||
</th>
|
||||
<td>
|
||||
<input id="edd_license_key" name="edd_license_key" type="text" class="regular-text" value="<?php esc_attr_e( $license ); ?>" />
|
||||
<label class="description" for="edd_license_key"><?php _e('Enter your license key'); ?></label>
|
||||
</td>
|
||||
</tr>
|
||||
<?php if( false !== $license ) { ?>
|
||||
<tr valign="top">
|
||||
<th scope="row" valign="top">
|
||||
<?php _e('Activate License'); ?>
|
||||
</th>
|
||||
<td>
|
||||
<?php if( $status !== false && $status == 'valid' ) { ?>
|
||||
<span style="color:green;"><?php _e('active'); ?></span>
|
||||
<?php wp_nonce_field( 'edd_nonce', 'edd_nonce' ); ?>
|
||||
<input type="submit" class="button-secondary" name="edd_license_deactivate" value="<?php _e('Deactivate License'); ?>"/>
|
||||
<?php } else {
|
||||
wp_nonce_field( 'edd_nonce', 'edd_nonce' ); ?>
|
||||
<input type="submit" class="button-secondary" name="edd_license_activate" value="<?php _e('Activate License'); ?>"/>
|
||||
<?php } ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php submit_button(); ?>
|
||||
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
|
||||
function edd_register_option() {
|
||||
// creates our settings in the options table
|
||||
register_setting('edd_license', 'edd_license_key', 'edd_sanitize_license' );
|
||||
}
|
||||
add_action('admin_init', 'edd_register_option');
|
||||
|
||||
function edd_sanitize_license( $new ) {
|
||||
$old = get_option( 'edd_license_key' );
|
||||
if( $old && $old != $new ) {
|
||||
delete_option( 'edd_license_status' ); // new license has been entered, so must reactivate
|
||||
}
|
||||
return $new;
|
||||
}
|
||||
|
||||
function edd_activate_license() {
|
||||
|
||||
// listen for our activate button to be clicked
|
||||
if( isset( $_POST['edd_license_activate'] ) ) {
|
||||
|
||||
// run a quick security check
|
||||
if( ! check_admin_referer( 'edd_nonce', 'edd_nonce' ) )
|
||||
return; // get out if we didn't click the Activate button
|
||||
|
||||
$license = trim( get_option( 'edd_license_key' ) );
|
||||
|
||||
$api_params = array(
|
||||
'edd_action' => 'activate_license',
|
||||
'license' => $license,
|
||||
'item_name' => urlencode( 'Coupon Manager' ),
|
||||
'url' => home_url()
|
||||
);
|
||||
|
||||
// Call the custom API.
|
||||
$response = wp_remote_post( EDD_STORE_URL, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
|
||||
|
||||
// make sure the response came back okay
|
||||
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
|
||||
|
||||
if ( is_wp_error( $response ) ) {
|
||||
$message = $response->get_error_message();
|
||||
} else {
|
||||
$message = __( 'An error occurred, please try again.' );
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
|
||||
|
||||
if ( false === $license_data->success ) {
|
||||
|
||||
switch( $license_data->error ) {
|
||||
|
||||
case 'expired' :
|
||||
|
||||
$message = sprintf(
|
||||
__( 'Your license key expired on %s.' ),
|
||||
date_i18n( get_option( 'date_format' ), strtotime( $license_data->expires, current_time( 'timestamp' ) ) )
|
||||
);
|
||||
break;
|
||||
|
||||
case 'disabled' :
|
||||
case 'revoked' :
|
||||
|
||||
$message = __( 'Your license key has been disabled.' );
|
||||
break;
|
||||
|
||||
case 'missing' :
|
||||
|
||||
$message = __( 'Invalid license.' );
|
||||
break;
|
||||
|
||||
case 'invalid' :
|
||||
case 'site_inactive' :
|
||||
|
||||
$message = __( 'Your license is not active for this URL.' );
|
||||
break;
|
||||
case 'item_name_mismatch' :
|
||||
|
||||
$message = sprintf( __( 'This appears to be an invalid license key for %s.' ), 'WP Domain Auctions' );
|
||||
break;
|
||||
|
||||
case 'no_activations_left':
|
||||
|
||||
$message = __( 'Your license key has reached its activation limit.' );
|
||||
break;
|
||||
|
||||
default :
|
||||
|
||||
$message = __( 'An error occurred, please try again.' );
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check if anything passed on a message constituting a failure
|
||||
if ( ! empty( $message ) ) {
|
||||
$base_url = admin_url( 'admin.php?page=' . EDD_PLUGIN_LICENSE_PAGE );
|
||||
$redirect = add_query_arg( array( 'sl_activation' => 'false', 'message' => urlencode( $message ) ), $base_url );
|
||||
|
||||
wp_redirect( $redirect );
|
||||
exit();
|
||||
}
|
||||
|
||||
// $license_data->license will be either "valid" or "invalid"
|
||||
|
||||
update_option( 'edd_license_status', $license_data->license );
|
||||
wp_redirect( admin_url( 'admin.php?page=' . EDD_PLUGIN_LICENSE_PAGE ) );
|
||||
exit();
|
||||
}
|
||||
}
|
||||
add_action('admin_init', 'edd_activate_license');
|
||||
|
||||
function edd_deactivate_license() {
|
||||
|
||||
// listen for our activate button to be clicked
|
||||
if( isset( $_POST['edd_license_deactivate'] ) ) {
|
||||
|
||||
// run a quick security check
|
||||
if( ! check_admin_referer( 'edd_nonce', 'edd_nonce' ) )
|
||||
return; // get out if we didn't click the Activate button
|
||||
|
||||
// retrieve the license from the database
|
||||
$license = trim( get_option( 'edd_license_key' ) );
|
||||
|
||||
|
||||
// data to send in our API request
|
||||
$api_params = array(
|
||||
'edd_action' => 'deactivate_license',
|
||||
'license' => $license,
|
||||
'item_name' => urlencode( 'Coupon Manager' ),
|
||||
'url' => home_url()
|
||||
);
|
||||
|
||||
// Call the custom API.
|
||||
$response = wp_remote_post( EDD_STORE_URL, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
|
||||
|
||||
|
||||
// make sure the response came back okay
|
||||
if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
|
||||
|
||||
if ( is_wp_error( $response ) ) {
|
||||
$message = $response->get_error_message();
|
||||
} else {
|
||||
$message = __( 'An error occurred, please try again.' );
|
||||
}
|
||||
|
||||
$base_url = admin_url( 'admin.php?page=' . EDD_PLUGIN_LICENSE_PAGE );
|
||||
$redirect = add_query_arg( array( 'sl_activation' => 'false', 'message' => urlencode( $message ) ), $base_url );
|
||||
|
||||
wp_redirect( $redirect );
|
||||
exit();
|
||||
}
|
||||
|
||||
// decode the license data
|
||||
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
|
||||
|
||||
// $license_data->license will be either "deactivated" or "failed"
|
||||
if( $license_data->license == 'deactivated' ) {
|
||||
delete_option( 'edd_license_status' );
|
||||
}elseif($license_data->license == 'failed'){
|
||||
delete_option( 'edd_license_status' );
|
||||
}
|
||||
|
||||
$base_url = admin_url( 'admin.php?page=' . EDD_PLUGIN_LICENSE_PAGE );
|
||||
$redirect = add_query_arg( array( 'sl_activation' => 'false', 'message' => urlencode( "License Deactivated" ) ), $base_url );
|
||||
|
||||
wp_redirect( $redirect );
|
||||
exit();
|
||||
|
||||
}
|
||||
}
|
||||
add_action('admin_init', 'edd_deactivate_license');
|
||||
|
||||
function edd_check_license() {
|
||||
|
||||
global $wp_version;
|
||||
|
||||
$license = trim( get_option( 'edd_license_key' ) );
|
||||
|
||||
$api_params = array(
|
||||
'edd_action' => 'check_license',
|
||||
'license' => $license,
|
||||
'item_name' => urlencode( 'WP Domain Auctions' ),
|
||||
'url' => home_url()
|
||||
);
|
||||
|
||||
// Call the custom API.
|
||||
$response = wp_remote_post( EDD_STORE_URL, array( 'timeout' => 15, 'sslverify' => false, 'body' => $api_params ) );
|
||||
|
||||
if ( is_wp_error( $response ) )
|
||||
return false;
|
||||
|
||||
$license_data = json_decode( wp_remote_retrieve_body( $response ) );
|
||||
|
||||
if( $license_data->license == 'valid' ) {
|
||||
echo 'valid'; exit;
|
||||
// this license is still valid
|
||||
} else {
|
||||
echo 'invalid'; exit;
|
||||
// this license is no longer valid
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This is a means of catching errors from the activation method above and displaying it to the customer
|
||||
*/
|
||||
function edd_admin_notices() {
|
||||
if ( isset( $_GET['sl_activation'] ) && ! empty( $_GET['message'] ) ) {
|
||||
|
||||
switch( $_GET['sl_activation'] ) {
|
||||
|
||||
case 'false':
|
||||
$message = urldecode( $_GET['message'] );
|
||||
?>
|
||||
<div class="error">
|
||||
<p><?php echo $message; ?></p>
|
||||
</div>
|
||||
<?php
|
||||
break;
|
||||
|
||||
case 'true':
|
||||
default:
|
||||
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
add_action( 'admin_notices', 'edd_admin_notices' );
|
||||
|
|
@ -0,0 +1,572 @@
|
|||
<?php
|
||||
|
||||
// Exit if accessed directly
|
||||
if ( ! defined( 'ABSPATH' ) ) exit;
|
||||
|
||||
/**
|
||||
* Allows plugins to use their own update API.
|
||||
*
|
||||
* @author Easy Digital Downloads
|
||||
* @version 1.6.18
|
||||
*/
|
||||
class EDD_SL_Plugin_Updater {
|
||||
|
||||
private $api_url = '';
|
||||
private $api_data = array();
|
||||
private $name = '';
|
||||
private $slug = '';
|
||||
private $version = '';
|
||||
private $wp_override = false;
|
||||
private $cache_key = '';
|
||||
|
||||
private $health_check_timeout = 5;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @uses plugin_basename()
|
||||
* @uses hook()
|
||||
*
|
||||
* @param string $_api_url The URL pointing to the custom API endpoint.
|
||||
* @param string $_plugin_file Path to the plugin file.
|
||||
* @param array $_api_data Optional data to send with API calls.
|
||||
*/
|
||||
public function __construct( $_api_url, $_plugin_file, $_api_data = null ) {
|
||||
|
||||
global $edd_plugin_data;
|
||||
|
||||
$this->api_url = trailingslashit( $_api_url );
|
||||
$this->api_data = $_api_data;
|
||||
$this->name = plugin_basename( $_plugin_file );
|
||||
$this->slug = basename( $_plugin_file, '.php' );
|
||||
$this->version = $_api_data['version'];
|
||||
$this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false;
|
||||
$this->beta = ! empty( $this->api_data['beta'] ) ? true : false;
|
||||
$this->cache_key = 'edd_sl_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) );
|
||||
|
||||
$edd_plugin_data[ $this->slug ] = $this->api_data;
|
||||
|
||||
/**
|
||||
* Fires after the $edd_plugin_data is setup.
|
||||
*
|
||||
* @since x.x.x
|
||||
*
|
||||
* @param array $edd_plugin_data Array of EDD SL plugin data.
|
||||
*/
|
||||
do_action( 'post_edd_sl_plugin_updater_setup', $edd_plugin_data );
|
||||
|
||||
// Set up hooks.
|
||||
$this->init();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up WordPress filters to hook into WP's update process.
|
||||
*
|
||||
* @uses add_filter()
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function init() {
|
||||
|
||||
add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
|
||||
add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 );
|
||||
remove_action( 'after_plugin_row_' . $this->name, 'wp_plugin_update_row', 10 );
|
||||
add_action( 'after_plugin_row_' . $this->name, array( $this, 'show_update_notification' ), 10, 2 );
|
||||
add_action( 'admin_init', array( $this, 'show_changelog' ) );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for Updates at the defined API endpoint and modify the update array.
|
||||
*
|
||||
* This function dives into the update API just when WordPress creates its update array,
|
||||
* then adds a custom API call and injects the custom plugin data retrieved from the API.
|
||||
* It is reassembled from parts of the native WordPress plugin update code.
|
||||
* See wp-includes/update.php line 121 for the original wp_update_plugins() function.
|
||||
*
|
||||
* @uses api_request()
|
||||
*
|
||||
* @param array $_transient_data Update array build by WordPress.
|
||||
* @return array Modified update array with custom plugin data.
|
||||
*/
|
||||
public function check_update( $_transient_data ) {
|
||||
|
||||
global $pagenow;
|
||||
|
||||
if ( ! is_object( $_transient_data ) ) {
|
||||
$_transient_data = new stdClass;
|
||||
}
|
||||
|
||||
if ( 'plugins.php' == $pagenow && is_multisite() ) {
|
||||
return $_transient_data;
|
||||
}
|
||||
|
||||
if ( ! empty( $_transient_data->response ) && ! empty( $_transient_data->response[ $this->name ] ) && false === $this->wp_override ) {
|
||||
return $_transient_data;
|
||||
}
|
||||
|
||||
$version_info = $this->get_cached_version_info();
|
||||
|
||||
if ( false === $version_info ) {
|
||||
$version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) );
|
||||
|
||||
$this->set_version_info_cache( $version_info );
|
||||
|
||||
}
|
||||
|
||||
if ( false !== $version_info && is_object( $version_info ) && isset( $version_info->new_version ) ) {
|
||||
|
||||
if ( version_compare( $this->version, $version_info->new_version, '<' ) ) {
|
||||
|
||||
$_transient_data->response[ $this->name ] = $version_info;
|
||||
|
||||
// Make sure the plugin property is set to the plugin's name/location. See issue 1463 on Software Licensing's GitHub repo.
|
||||
$_transient_data->response[ $this->name ]->plugin = $this->name;
|
||||
|
||||
}
|
||||
|
||||
$_transient_data->last_checked = time();
|
||||
$_transient_data->checked[ $this->name ] = $this->version;
|
||||
|
||||
}
|
||||
|
||||
return $_transient_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* show update nofication row -- needed for multisite subsites, because WP won't tell you otherwise!
|
||||
*
|
||||
* @param string $file
|
||||
* @param array $plugin
|
||||
*/
|
||||
public function show_update_notification( $file, $plugin ) {
|
||||
|
||||
if ( is_network_admin() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( ! current_user_can( 'update_plugins' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( ! is_multisite() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $this->name != $file ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove our filter on the site transient
|
||||
remove_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ), 10 );
|
||||
|
||||
$update_cache = get_site_transient( 'update_plugins' );
|
||||
|
||||
$update_cache = is_object( $update_cache ) ? $update_cache : new stdClass();
|
||||
|
||||
if ( empty( $update_cache->response ) || empty( $update_cache->response[ $this->name ] ) ) {
|
||||
|
||||
$version_info = $this->get_cached_version_info();
|
||||
|
||||
if ( false === $version_info ) {
|
||||
$version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta ) );
|
||||
|
||||
// Since we disabled our filter for the transient, we aren't running our object conversion on banners, sections, or icons. Do this now:
|
||||
if ( isset( $version_info->banners ) && ! is_array( $version_info->banners ) ) {
|
||||
$version_info->banners = $this->convert_object_to_array( $version_info->banners );
|
||||
}
|
||||
|
||||
if ( isset( $version_info->sections ) && ! is_array( $version_info->sections ) ) {
|
||||
$version_info->sections = $this->convert_object_to_array( $version_info->sections );
|
||||
}
|
||||
|
||||
if ( isset( $version_info->icons ) && ! is_array( $version_info->icons ) ) {
|
||||
$version_info->icons = $this->convert_object_to_array( $version_info->icons );
|
||||
}
|
||||
|
||||
$this->set_version_info_cache( $version_info );
|
||||
}
|
||||
|
||||
if ( ! is_object( $version_info ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( version_compare( $this->version, $version_info->new_version, '<' ) ) {
|
||||
|
||||
$update_cache->response[ $this->name ] = $version_info;
|
||||
|
||||
}
|
||||
|
||||
$update_cache->last_checked = time();
|
||||
$update_cache->checked[ $this->name ] = $this->version;
|
||||
|
||||
set_site_transient( 'update_plugins', $update_cache );
|
||||
|
||||
} else {
|
||||
|
||||
$version_info = $update_cache->response[ $this->name ];
|
||||
|
||||
}
|
||||
|
||||
// Restore our filter
|
||||
add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) );
|
||||
|
||||
if ( ! empty( $update_cache->response[ $this->name ] ) && version_compare( $this->version, $version_info->new_version, '<' ) ) {
|
||||
|
||||
// build a plugin list row, with update notification
|
||||
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
|
||||
# <tr class="plugin-update-tr"><td colspan="' . $wp_list_table->get_column_count() . '" class="plugin-update colspanchange">
|
||||
echo '<tr class="plugin-update-tr" id="' . $this->slug . '-update" data-slug="' . $this->slug . '" data-plugin="' . $this->slug . '/' . $file . '">';
|
||||
echo '<td colspan="3" class="plugin-update colspanchange">';
|
||||
echo '<div class="update-message notice inline notice-warning notice-alt">';
|
||||
|
||||
$changelog_link = self_admin_url( 'index.php?edd_sl_action=view_plugin_changelog&plugin=' . $this->name . '&slug=' . $this->slug . '&TB_iframe=true&width=772&height=911' );
|
||||
|
||||
if ( empty( $version_info->download_link ) ) {
|
||||
printf(
|
||||
__( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s.', 'easy-digital-downloads' ),
|
||||
esc_html( $version_info->name ),
|
||||
'<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">',
|
||||
esc_html( $version_info->new_version ),
|
||||
'</a>'
|
||||
);
|
||||
} else {
|
||||
printf(
|
||||
__( 'There is a new version of %1$s available. %2$sView version %3$s details%4$s or %5$supdate now%6$s.', 'easy-digital-downloads' ),
|
||||
esc_html( $version_info->name ),
|
||||
'<a target="_blank" class="thickbox" href="' . esc_url( $changelog_link ) . '">',
|
||||
esc_html( $version_info->new_version ),
|
||||
'</a>',
|
||||
'<a href="' . esc_url( wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $this->name, 'upgrade-plugin_' . $this->name ) ) .'">',
|
||||
'</a>'
|
||||
);
|
||||
}
|
||||
|
||||
do_action( "in_plugin_update_message-{$file}", $plugin, $version_info );
|
||||
|
||||
echo '</div></td></tr>';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates information on the "View version x.x details" page with custom data.
|
||||
*
|
||||
* @uses api_request()
|
||||
*
|
||||
* @param mixed $_data
|
||||
* @param string $_action
|
||||
* @param object $_args
|
||||
* @return object $_data
|
||||
*/
|
||||
public function plugins_api_filter( $_data, $_action = '', $_args = null ) {
|
||||
|
||||
if ( $_action != 'plugin_information' ) {
|
||||
|
||||
return $_data;
|
||||
|
||||
}
|
||||
|
||||
if ( ! isset( $_args->slug ) || ( $_args->slug != $this->slug ) ) {
|
||||
|
||||
return $_data;
|
||||
|
||||
}
|
||||
|
||||
$to_send = array(
|
||||
'slug' => $this->slug,
|
||||
'is_ssl' => is_ssl(),
|
||||
'fields' => array(
|
||||
'banners' => array(),
|
||||
'reviews' => false,
|
||||
'icons' => array(),
|
||||
)
|
||||
);
|
||||
|
||||
$cache_key = 'edd_api_request_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) );
|
||||
|
||||
// Get the transient where we store the api request for this plugin for 24 hours
|
||||
$edd_api_request_transient = $this->get_cached_version_info( $cache_key );
|
||||
|
||||
//If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now.
|
||||
if ( empty( $edd_api_request_transient ) ) {
|
||||
|
||||
$api_response = $this->api_request( 'plugin_information', $to_send );
|
||||
|
||||
// Expires in 3 hours
|
||||
$this->set_version_info_cache( $api_response, $cache_key );
|
||||
|
||||
if ( false !== $api_response ) {
|
||||
$_data = $api_response;
|
||||
}
|
||||
|
||||
} else {
|
||||
$_data = $edd_api_request_transient;
|
||||
}
|
||||
|
||||
// Convert sections into an associative array, since we're getting an object, but Core expects an array.
|
||||
if ( isset( $_data->sections ) && ! is_array( $_data->sections ) ) {
|
||||
$_data->sections = $this->convert_object_to_array( $_data->sections );
|
||||
}
|
||||
|
||||
// Convert banners into an associative array, since we're getting an object, but Core expects an array.
|
||||
if ( isset( $_data->banners ) && ! is_array( $_data->banners ) ) {
|
||||
$_data->banners = $this->convert_object_to_array( $_data->banners );
|
||||
}
|
||||
|
||||
// Convert icons into an associative array, since we're getting an object, but Core expects an array.
|
||||
if ( isset( $_data->icons ) && ! is_array( $_data->icons ) ) {
|
||||
$_data->icons = $this->convert_object_to_array( $_data->icons );
|
||||
}
|
||||
|
||||
if( ! isset( $_data->plugin ) ) {
|
||||
$_data->plugin = $this->name;
|
||||
}
|
||||
|
||||
return $_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert some objects to arrays when injecting data into the update API
|
||||
*
|
||||
* Some data like sections, banners, and icons are expected to be an associative array, however due to the JSON
|
||||
* decoding, they are objects. This method allows us to pass in the object and return an associative array.
|
||||
*
|
||||
* @since 3.6.5
|
||||
*
|
||||
* @param stdClass $data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function convert_object_to_array( $data ) {
|
||||
$new_data = array();
|
||||
foreach ( $data as $key => $value ) {
|
||||
$new_data[ $key ] = $value;
|
||||
}
|
||||
|
||||
return $new_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable SSL verification in order to prevent download update failures
|
||||
*
|
||||
* @param array $args
|
||||
* @param string $url
|
||||
* @return object $array
|
||||
*/
|
||||
public function http_request_args( $args, $url ) {
|
||||
|
||||
$verify_ssl = $this->verify_ssl();
|
||||
if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) {
|
||||
$args['sslverify'] = $verify_ssl;
|
||||
}
|
||||
return $args;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls the API and, if successfull, returns the object delivered by the API.
|
||||
*
|
||||
* @uses get_bloginfo()
|
||||
* @uses wp_remote_post()
|
||||
* @uses is_wp_error()
|
||||
*
|
||||
* @param string $_action The requested action.
|
||||
* @param array $_data Parameters for the API action.
|
||||
* @return false|object
|
||||
*/
|
||||
private function api_request( $_action, $_data ) {
|
||||
|
||||
global $wp_version, $edd_plugin_url_available;
|
||||
|
||||
$verify_ssl = $this->verify_ssl();
|
||||
|
||||
// Do a quick status check on this domain if we haven't already checked it.
|
||||
$store_hash = md5( $this->api_url );
|
||||
if ( ! is_array( $edd_plugin_url_available ) || ! isset( $edd_plugin_url_available[ $store_hash ] ) ) {
|
||||
$test_url_parts = parse_url( $this->api_url );
|
||||
|
||||
$scheme = ! empty( $test_url_parts['scheme'] ) ? $test_url_parts['scheme'] : 'http';
|
||||
$host = ! empty( $test_url_parts['host'] ) ? $test_url_parts['host'] : '';
|
||||
$port = ! empty( $test_url_parts['port'] ) ? ':' . $test_url_parts['port'] : '';
|
||||
|
||||
if ( empty( $host ) ) {
|
||||
$edd_plugin_url_available[ $store_hash ] = false;
|
||||
} else {
|
||||
$test_url = $scheme . '://' . $host . $port;
|
||||
$response = wp_remote_get( $test_url, array( 'timeout' => $this->health_check_timeout, 'sslverify' => $verify_ssl ) );
|
||||
$edd_plugin_url_available[ $store_hash ] = is_wp_error( $response ) ? false : true;
|
||||
}
|
||||
}
|
||||
|
||||
if ( false === $edd_plugin_url_available[ $store_hash ] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$data = array_merge( $this->api_data, $_data );
|
||||
|
||||
if ( $data['slug'] != $this->slug ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( $this->api_url == trailingslashit ( home_url() ) ) {
|
||||
return false; // Don't allow a plugin to ping itself
|
||||
}
|
||||
|
||||
$api_params = array(
|
||||
'edd_action' => 'get_version',
|
||||
'license' => ! empty( $data['license'] ) ? $data['license'] : '',
|
||||
'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false,
|
||||
'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false,
|
||||
'version' => isset( $data['version'] ) ? $data['version'] : false,
|
||||
'slug' => $data['slug'],
|
||||
'author' => $data['author'],
|
||||
'url' => home_url(),
|
||||
'beta' => ! empty( $data['beta'] ),
|
||||
);
|
||||
|
||||
$request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $verify_ssl, 'body' => $api_params ) );
|
||||
|
||||
if ( ! is_wp_error( $request ) ) {
|
||||
$request = json_decode( wp_remote_retrieve_body( $request ) );
|
||||
}
|
||||
|
||||
if ( $request && isset( $request->sections ) ) {
|
||||
$request->sections = maybe_unserialize( $request->sections );
|
||||
} else {
|
||||
$request = false;
|
||||
}
|
||||
|
||||
if ( $request && isset( $request->banners ) ) {
|
||||
$request->banners = maybe_unserialize( $request->banners );
|
||||
}
|
||||
|
||||
if ( $request && isset( $request->icons ) ) {
|
||||
$request->icons = maybe_unserialize( $request->icons );
|
||||
}
|
||||
|
||||
if( ! empty( $request->sections ) ) {
|
||||
foreach( $request->sections as $key => $section ) {
|
||||
$request->$key = (array) $section;
|
||||
}
|
||||
}
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
public function show_changelog() {
|
||||
|
||||
global $edd_plugin_data;
|
||||
|
||||
if( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' != $_REQUEST['edd_sl_action'] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( empty( $_REQUEST['plugin'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( empty( $_REQUEST['slug'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if( ! current_user_can( 'update_plugins' ) ) {
|
||||
wp_die( __( 'You do not have permission to install plugin updates', 'easy-digital-downloads' ), __( 'Error', 'easy-digital-downloads' ), array( 'response' => 403 ) );
|
||||
}
|
||||
|
||||
$data = $edd_plugin_data[ $_REQUEST['slug'] ];
|
||||
$beta = ! empty( $data['beta'] ) ? true : false;
|
||||
$cache_key = md5( 'edd_plugin_' . sanitize_key( $_REQUEST['plugin'] ) . '_' . $beta . '_version_info' );
|
||||
$version_info = $this->get_cached_version_info( $cache_key );
|
||||
|
||||
if( false === $version_info ) {
|
||||
|
||||
$api_params = array(
|
||||
'edd_action' => 'get_version',
|
||||
'item_name' => isset( $data['item_name'] ) ? $data['item_name'] : false,
|
||||
'item_id' => isset( $data['item_id'] ) ? $data['item_id'] : false,
|
||||
'slug' => $_REQUEST['slug'],
|
||||
'author' => $data['author'],
|
||||
'url' => home_url(),
|
||||
'beta' => ! empty( $data['beta'] )
|
||||
);
|
||||
|
||||
$verify_ssl = $this->verify_ssl();
|
||||
$request = wp_remote_post( $this->api_url, array( 'timeout' => 15, 'sslverify' => $verify_ssl, 'body' => $api_params ) );
|
||||
|
||||
if ( ! is_wp_error( $request ) ) {
|
||||
$version_info = json_decode( wp_remote_retrieve_body( $request ) );
|
||||
}
|
||||
|
||||
|
||||
if ( ! empty( $version_info ) && isset( $version_info->sections ) ) {
|
||||
$version_info->sections = maybe_unserialize( $version_info->sections );
|
||||
} else {
|
||||
$version_info = false;
|
||||
}
|
||||
|
||||
if( ! empty( $version_info ) ) {
|
||||
foreach( $version_info->sections as $key => $section ) {
|
||||
$version_info->$key = (array) $section;
|
||||
}
|
||||
}
|
||||
|
||||
$this->set_version_info_cache( $version_info, $cache_key );
|
||||
|
||||
}
|
||||
|
||||
if( ! empty( $version_info ) && isset( $version_info->sections['changelog'] ) ) {
|
||||
echo '<div style="background:#fff;padding:10px;">' . $version_info->sections['changelog'] . '</div>';
|
||||
}
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
public function get_cached_version_info( $cache_key = '' ) {
|
||||
|
||||
if( empty( $cache_key ) ) {
|
||||
$cache_key = $this->cache_key;
|
||||
}
|
||||
|
||||
$cache = get_option( $cache_key );
|
||||
|
||||
if( empty( $cache['timeout'] ) || time() > $cache['timeout'] ) {
|
||||
return false; // Cache is expired
|
||||
}
|
||||
|
||||
// We need to turn the icons into an array, thanks to WP Core forcing these into an object at some point.
|
||||
$cache['value'] = json_decode( $cache['value'] );
|
||||
if ( ! empty( $cache['value']->icons ) ) {
|
||||
$cache['value']->icons = (array) $cache['value']->icons;
|
||||
}
|
||||
|
||||
return $cache['value'];
|
||||
|
||||
}
|
||||
|
||||
public function set_version_info_cache( $value = '', $cache_key = '' ) {
|
||||
|
||||
if( empty( $cache_key ) ) {
|
||||
$cache_key = $this->cache_key;
|
||||
}
|
||||
|
||||
$data = array(
|
||||
'timeout' => strtotime( '+3 hours', time() ),
|
||||
'value' => json_encode( $value )
|
||||
);
|
||||
|
||||
update_option( $cache_key, $data, 'no' );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the SSL of the store should be verified.
|
||||
*
|
||||
* @since 1.6.13
|
||||
* @return bool
|
||||
*/
|
||||
private function verify_ssl() {
|
||||
return (bool) apply_filters( 'edd_sl_api_request_verify_ssl', true, $this );
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Fired during plugin activation
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
*/
|
||||
|
||||
/**
|
||||
* Fired during plugin activation.
|
||||
*
|
||||
* This class defines all code necessary to run during the plugin's activation.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager_Activator {
|
||||
|
||||
/**
|
||||
* Short Description. (use period)
|
||||
*
|
||||
* Long Description.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public static function activate() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Fired during plugin deactivation
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
*/
|
||||
|
||||
/**
|
||||
* Fired during plugin deactivation.
|
||||
*
|
||||
* This class defines all code necessary to run during the plugin's deactivation.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager_Deactivator {
|
||||
|
||||
/**
|
||||
* Short Description. (use period)
|
||||
*
|
||||
* Long Description.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public static function deactivate() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Define the internationalization functionality
|
||||
*
|
||||
* Loads and defines the internationalization files for this plugin
|
||||
* so that it is ready for translation.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
*/
|
||||
|
||||
/**
|
||||
* Define the internationalization functionality.
|
||||
*
|
||||
* Loads and defines the internationalization files for this plugin
|
||||
* so that it is ready for translation.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager_i18n {
|
||||
|
||||
|
||||
/**
|
||||
* Load the plugin text domain for translation.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function load_plugin_textdomain() {
|
||||
|
||||
load_plugin_textdomain(
|
||||
'coupon-manager',
|
||||
false,
|
||||
dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Register all actions and filters for the plugin
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
*/
|
||||
|
||||
/**
|
||||
* Register all actions and filters for the plugin.
|
||||
*
|
||||
* Maintain a list of all hooks that are registered throughout
|
||||
* the plugin, and register them with the WordPress API. Call the
|
||||
* run function to execute the list of actions and filters.
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager_Loader {
|
||||
|
||||
/**
|
||||
* The array of actions registered with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access protected
|
||||
* @var array $actions The actions registered with WordPress to fire when the plugin loads.
|
||||
*/
|
||||
protected $actions;
|
||||
|
||||
/**
|
||||
* The array of filters registered with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access protected
|
||||
* @var array $filters The filters registered with WordPress to fire when the plugin loads.
|
||||
*/
|
||||
protected $filters;
|
||||
|
||||
/**
|
||||
* Initialize the collections used to maintain the actions and filters.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function __construct() {
|
||||
|
||||
$this->actions = array();
|
||||
$this->filters = array();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new action to the collection to be registered with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @param string $hook The name of the WordPress action that is being registered.
|
||||
* @param object $component A reference to the instance of the object on which the action is defined.
|
||||
* @param string $callback The name of the function definition on the $component.
|
||||
* @param int $priority Optional. The priority at which the function should be fired. Default is 10.
|
||||
* @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1.
|
||||
*/
|
||||
public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
|
||||
$this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new filter to the collection to be registered with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @param string $hook The name of the WordPress filter that is being registered.
|
||||
* @param object $component A reference to the instance of the object on which the filter is defined.
|
||||
* @param string $callback The name of the function definition on the $component.
|
||||
* @param int $priority Optional. The priority at which the function should be fired. Default is 10.
|
||||
* @param int $accepted_args Optional. The number of arguments that should be passed to the $callback. Default is 1
|
||||
*/
|
||||
public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) {
|
||||
$this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args );
|
||||
}
|
||||
|
||||
/**
|
||||
* A utility function that is used to register the actions and hooks into a single
|
||||
* collection.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
* @param array $hooks The collection of hooks that is being registered (that is, actions or filters).
|
||||
* @param string $hook The name of the WordPress filter that is being registered.
|
||||
* @param object $component A reference to the instance of the object on which the filter is defined.
|
||||
* @param string $callback The name of the function definition on the $component.
|
||||
* @param int $priority The priority at which the function should be fired.
|
||||
* @param int $accepted_args The number of arguments that should be passed to the $callback.
|
||||
* @return array The collection of actions and filters registered with WordPress.
|
||||
*/
|
||||
private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) {
|
||||
|
||||
$hooks[] = array(
|
||||
'hook' => $hook,
|
||||
'component' => $component,
|
||||
'callback' => $callback,
|
||||
'priority' => $priority,
|
||||
'accepted_args' => $accepted_args
|
||||
);
|
||||
|
||||
return $hooks;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the filters and actions with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function run() {
|
||||
|
||||
foreach ( $this->filters as $hook ) {
|
||||
add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
|
||||
}
|
||||
|
||||
foreach ( $this->actions as $hook ) {
|
||||
add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,241 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The file that defines the core plugin class
|
||||
*
|
||||
* A class definition that includes attributes and functions used across both the
|
||||
* public-facing side of the site and the admin area.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
*/
|
||||
|
||||
/**
|
||||
* The core plugin class.
|
||||
*
|
||||
* This is used to define internationalization, admin-specific hooks, and
|
||||
* public-facing site hooks.
|
||||
*
|
||||
* Also maintains the unique identifier of this plugin as well as the current
|
||||
* version of the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/includes
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager {
|
||||
|
||||
/**
|
||||
* The loader that's responsible for maintaining and registering all hooks that power
|
||||
* the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access protected
|
||||
* @var Coupon_Manager_Loader $loader Maintains and registers all hooks for the plugin.
|
||||
*/
|
||||
protected $loader;
|
||||
|
||||
/**
|
||||
* The unique identifier of this plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access protected
|
||||
* @var string $plugin_name The string used to uniquely identify this plugin.
|
||||
*/
|
||||
protected $plugin_name;
|
||||
|
||||
/**
|
||||
* The current version of the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access protected
|
||||
* @var string $version The current version of the plugin.
|
||||
*/
|
||||
protected $version;
|
||||
|
||||
/**
|
||||
* Define the core functionality of the plugin.
|
||||
*
|
||||
* Set the plugin name and the plugin version that can be used throughout the plugin.
|
||||
* Load the dependencies, define the locale, and set the hooks for the admin area and
|
||||
* the public-facing side of the site.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function __construct() {
|
||||
if ( defined( 'COUPON_MANAGER_VERSION' ) ) {
|
||||
$this->version = COUPON_MANAGER_VERSION;
|
||||
} else {
|
||||
$this->version = '1.0.0';
|
||||
}
|
||||
$this->plugin_name = 'coupon-manager';
|
||||
|
||||
$this->load_dependencies();
|
||||
$this->set_locale();
|
||||
$this->define_admin_hooks();
|
||||
$this->define_public_hooks();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the required dependencies for this plugin.
|
||||
*
|
||||
* Include the following files that make up the plugin:
|
||||
*
|
||||
* - Coupon_Manager_Loader. Orchestrates the hooks of the plugin.
|
||||
* - Coupon_Manager_i18n. Defines internationalization functionality.
|
||||
* - Coupon_Manager_Admin. Defines all hooks for the admin area.
|
||||
* - Coupon_Manager_Public. Defines all hooks for the public side of the site.
|
||||
*
|
||||
* Create an instance of the loader which will be used to register the hooks
|
||||
* with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
*/
|
||||
private function load_dependencies() {
|
||||
|
||||
/**
|
||||
* The class responsible for orchestrating the actions and filters of the
|
||||
* core plugin.
|
||||
*/
|
||||
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-coupon-manager-loader.php';
|
||||
|
||||
/**
|
||||
* The class responsible for defining internationalization functionality
|
||||
* of the plugin.
|
||||
*/
|
||||
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-coupon-manager-i18n.php';
|
||||
|
||||
/**
|
||||
* The class responsible for defining all actions that occur in the admin area.
|
||||
*/
|
||||
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-coupon-manager-admin.php';
|
||||
|
||||
/**
|
||||
* The class responsible for defining all actions that occur in the public-facing
|
||||
* side of the site.
|
||||
*/
|
||||
require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-coupon-manager-public.php';
|
||||
|
||||
$this->loader = new Coupon_Manager_Loader();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the locale for this plugin for internationalization.
|
||||
*
|
||||
* Uses the Coupon_Manager_i18n class in order to set the domain and to register the hook
|
||||
* with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
*/
|
||||
private function set_locale() {
|
||||
|
||||
$plugin_i18n = new Coupon_Manager_i18n();
|
||||
|
||||
$this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain' );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Register all of the hooks related to the admin area functionality
|
||||
* of the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
*/
|
||||
private function define_admin_hooks() {
|
||||
|
||||
$plugin_admin = new Coupon_Manager_Admin( $this->get_plugin_name(), $this->get_version() );
|
||||
|
||||
$edd_license_status = get_option('edd_license_status');
|
||||
|
||||
if(!$edd_license_status || $edd_license_status != 'valid'){
|
||||
$this->loader->add_action( 'admin_notices', $plugin_admin, 'admin_notice' );
|
||||
}
|
||||
|
||||
if($edd_license_status == 'valid'){
|
||||
$this->loader->add_action( 'init', $plugin_admin, 'create_couponuser_cpt' );
|
||||
}
|
||||
|
||||
$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_styles' );
|
||||
$this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' );
|
||||
$this->loader->add_action( 'admin_menu', $plugin_admin, 'display_admin_page' );
|
||||
$this->loader->add_action( 'admin_init', $plugin_admin, 'coupon_manager_settings_group' );
|
||||
|
||||
$this->loader->add_action( 'add_meta_boxes', $plugin_admin, 'add_coupon_uses_meta' );
|
||||
$this->loader->add_action( 'save_post', $plugin_admin, 'coupon_uses_save_postdata' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Register all of the hooks related to the public-facing functionality
|
||||
* of the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
*/
|
||||
private function define_public_hooks() {
|
||||
|
||||
$plugin_public = new Coupon_Manager_Public( $this->get_plugin_name(), $this->get_version() );
|
||||
|
||||
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
|
||||
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
|
||||
|
||||
$edd_license_status = get_option('edd_license_status');
|
||||
|
||||
if($edd_license_status && $edd_license_status == 'valid'){
|
||||
$this->loader->add_action( 'woocommerce_thankyou', $plugin_public, 'generate_coupon' );
|
||||
$this->loader->add_action( 'woocommerce_thankyou', $plugin_public, 'coupon_add_content_thankyou' );
|
||||
$this->loader->add_action( 'woocommerce_applied_coupon', $plugin_public, 'generate_coupon_user_post' );
|
||||
$this->loader->add_action( 'woocommerce_email_after_order_table ', $plugin_public, 'add_order_email_coupon_details' );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the loader to execute all of the hooks with WordPress.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function run() {
|
||||
$this->loader->run();
|
||||
}
|
||||
|
||||
/**
|
||||
* The name of the plugin used to uniquely identify it within the context of
|
||||
* WordPress and to define internationalization functionality.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @return string The name of the plugin.
|
||||
*/
|
||||
public function get_plugin_name() {
|
||||
return $this->plugin_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* The reference to the class that orchestrates the hooks with the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @return Coupon_Manager_Loader Orchestrates the hooks of the plugin.
|
||||
*/
|
||||
public function get_loader() {
|
||||
return $this->loader;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the version number of the plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @return string The version number of the plugin.
|
||||
*/
|
||||
public function get_version() {
|
||||
return $this->version;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"BD": "BDT", "BE": "EUR", "BF": "XOF", "BG": "BGN", "BA": "BAM", "BB": "BBD", "WF": "XPF", "BL": "EUR", "BM": "BMD", "BN": "BND", "BO": "BOB", "BH": "BHD", "BI": "BIF", "BJ": "XOF", "BT": "BTN", "JM": "JMD", "BV": "NOK", "BW": "BWP", "WS": "WST", "BQ": "USD", "BR": "BRL", "BS": "BSD", "JE": "GBP", "BY": "BYR", "BZ": "BZD", "RU": "RUB", "RW": "RWF", "RS": "RSD", "TL": "USD", "RE": "EUR", "TM": "TMT", "TJ": "TJS", "RO": "RON", "TK": "NZD", "GW": "XOF", "GU": "USD", "GT": "GTQ", "GS": "GBP", "GR": "EUR", "GQ": "XAF", "GP": "EUR", "JP": "JPY", "GY": "GYD", "GG": "GBP", "GF": "EUR", "GE": "GEL", "GD": "XCD", "GB": "GBP", "GA": "XAF", "SV": "USD", "GN": "GNF", "GM": "GMD", "GL": "DKK", "GI": "GIP", "GH": "GHS", "OM": "OMR", "TN": "TND", "JO": "JOD", "HR": "HRK", "HT": "HTG", "HU": "HUF", "HK": "HKD", "HN": "HNL", "HM": "AUD", "VE": "VEF", "PR": "USD", "PS": "ILS", "PW": "USD", "PT": "EUR", "SJ": "NOK", "PY": "PYG", "IQ": "IQD", "PA": "PAB", "PF": "XPF", "PG": "PGK", "PE": "PEN", "PK": "PKR", "PH": "PHP", "PN": "NZD", "PL": "PLN", "PM": "EUR", "ZM": "ZMK", "EH": "MAD", "EE": "EUR", "EG": "EGP", "ZA": "ZAR", "EC": "USD", "IT": "EUR", "VN": "VND", "SB": "SBD", "ET": "ETB", "SO": "SOS", "ZW": "ZWL", "SA": "SAR", "ES": "EUR", "ER": "ERN", "ME": "EUR", "MD": "MDL", "MG": "MGA", "MF": "EUR", "MA": "MAD", "MC": "EUR", "UZ": "UZS", "MM": "MMK", "ML": "XOF", "MO": "MOP", "MN": "MNT", "MH": "USD", "MK": "MKD", "MU": "MUR", "MT": "EUR", "MW": "MWK", "MV": "MVR", "MQ": "EUR", "MP": "USD", "MS": "XCD", "MR": "MRO", "IM": "GBP", "UG": "UGX", "TZ": "TZS", "MY": "MYR", "MX": "MXN", "IL": "ILS", "FR": "EUR", "IO": "USD", "SH": "SHP", "FI": "EUR", "FJ": "FJD", "FK": "FKP", "FM": "USD", "FO": "DKK", "NI": "NIO", "NL": "EUR", "NO": "NOK", "NA": "NAD", "VU": "VUV", "NC": "XPF", "NE": "XOF", "NF": "AUD", "NG": "NGN", "NZ": "NZD", "NP": "NPR", "NR": "AUD", "NU": "NZD", "CK": "NZD", "XK": "EUR", "CI": "XOF", "CH": "CHF", "CO": "COP", "CN": "CNY", "CM": "XAF", "CL": "CLP", "CC": "AUD", "CA": "CAD", "CG": "XAF", "CF": "XAF", "CD": "CDF", "CZ": "CZK", "CY": "EUR", "CX": "AUD", "CR": "CRC", "CW": "ANG", "CV": "CVE", "CU": "CUP", "SZ": "SZL", "SY": "SYP", "SX": "ANG", "KG": "KGS", "KE": "KES", "SS": "SSP", "SR": "SRD", "KI": "AUD", "KH": "KHR", "KN": "XCD", "KM": "KMF", "ST": "STD", "SK": "EUR", "KR": "KRW", "SI": "EUR", "KP": "KPW", "KW": "KWD", "SN": "XOF", "SM": "EUR", "SL": "SLL", "SC": "SCR", "KZ": "KZT", "KY": "KYD", "SG": "SGD", "SE": "SEK", "SD": "SDG", "DO": "DOP", "DM": "XCD", "DJ": "DJF", "DK": "DKK", "VG": "USD", "DE": "EUR", "YE": "YER", "DZ": "DZD", "US": "USD", "UY": "UYU", "YT": "EUR", "UM": "USD", "LB": "LBP", "LC": "XCD", "LA": "LAK", "TV": "AUD", "TW": "TWD", "TT": "TTD", "TR": "TRY", "LK": "LKR", "LI": "CHF", "LV": "EUR", "TO": "TOP", "LT": "LTL", "LU": "EUR", "LR": "LRD", "LS": "LSL", "TH": "THB", "TF": "EUR", "TG": "XOF", "TD": "XAF", "TC": "USD", "LY": "LYD", "VA": "EUR", "VC": "XCD", "AE": "AED", "AD": "EUR", "AG": "XCD", "AF": "AFN", "AI": "XCD", "VI": "USD", "IS": "ISK", "IR": "IRR", "AM": "AMD", "AL": "ALL", "AO": "AOA", "AQ": "", "AS": "USD", "AR": "ARS", "AU": "AUD", "AT": "EUR", "AW": "AWG", "IN": "INR", "AX": "EUR", "AZ": "AZN", "IE": "EUR", "ID": "IDR", "UA": "UAH", "QA": "QAR", "MZ": "MZN"}
|
||||
|
|
@ -0,0 +1 @@
|
|||
<?php // Silence is golden
|
||||
|
|
@ -0,0 +1 @@
|
|||
<?php // Silence is golden
|
||||
|
|
@ -0,0 +1,308 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* The public-facing functionality of the plugin.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/public
|
||||
*/
|
||||
|
||||
/**
|
||||
* The public-facing functionality of the plugin.
|
||||
*
|
||||
* Defines the plugin name, version, and two examples hooks for how to
|
||||
* enqueue the public-facing stylesheet and JavaScript.
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/public
|
||||
* @author Abdul Wahab <rockingwahab9@gmail.com>
|
||||
*/
|
||||
class Coupon_Manager_Public {
|
||||
|
||||
/**
|
||||
* The ID of this plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
* @var string $plugin_name The ID of this plugin.
|
||||
*/
|
||||
private $plugin_name;
|
||||
|
||||
/**
|
||||
* The version of this plugin.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @access private
|
||||
* @var string $version The current version of this plugin.
|
||||
*/
|
||||
private $version;
|
||||
|
||||
/**
|
||||
* Initialize the class and set its properties.
|
||||
*
|
||||
* @since 1.0.0
|
||||
* @param string $plugin_name The name of the plugin.
|
||||
* @param string $version The version of this plugin.
|
||||
*/
|
||||
public function __construct( $plugin_name, $version ) {
|
||||
|
||||
$this->plugin_name = $plugin_name;
|
||||
$this->version = $version;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the stylesheets for the public-facing side of the site.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function enqueue_styles() {
|
||||
|
||||
/**
|
||||
* This function is provided for demonstration purposes only.
|
||||
*
|
||||
* An instance of this class should be passed to the run() function
|
||||
* defined in Coupon_Manager_Loader as all of the hooks are defined
|
||||
* in that particular class.
|
||||
*
|
||||
* The Coupon_Manager_Loader will then create the relationship
|
||||
* between the defined hooks and the functions defined in this
|
||||
* class.
|
||||
*/
|
||||
|
||||
wp_enqueue_style( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'css/coupon-manager-public.css', array(), $this->version, 'all' );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the JavaScript for the public-facing side of the site.
|
||||
*
|
||||
* @since 1.0.0
|
||||
*/
|
||||
public function enqueue_scripts() {
|
||||
|
||||
/**
|
||||
* This function is provided for demonstration purposes only.
|
||||
*
|
||||
* An instance of this class should be passed to the run() function
|
||||
* defined in Coupon_Manager_Loader as all of the hooks are defined
|
||||
* in that particular class.
|
||||
*
|
||||
* The Coupon_Manager_Loader will then create the relationship
|
||||
* between the defined hooks and the functions defined in this
|
||||
* class.
|
||||
*/
|
||||
|
||||
wp_enqueue_script( $this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/coupon-manager-public.js', array( 'jquery' ), $this->version, false );
|
||||
|
||||
}
|
||||
|
||||
public function generate_coupon(){
|
||||
|
||||
$order_id = wc_get_order_id_by_order_key( $_GET['key'] );
|
||||
$order = wc_get_order( $order_id );
|
||||
$site_url = get_site_url();
|
||||
$coupon_uses = false;
|
||||
if( $order->get_used_coupons() && !get_post_meta($order_id,'uses_c',true) ) {
|
||||
$coupon_uses = true;
|
||||
$coupons_count = count( $order->get_used_coupons() );
|
||||
|
||||
foreach( $order->get_used_coupons() as $coupon) {
|
||||
|
||||
$c = new WC_Coupon($coupon);
|
||||
// var_dump(get_post_meta( $c->get_id(),'billing_user_name',true));
|
||||
$name = $order->get_billing_first_name() . " ";
|
||||
$name .= $order->get_billing_last_name();
|
||||
|
||||
$username = $name;
|
||||
$useremail = $order->get_billing_email();
|
||||
$get_post_meta = get_post_meta($c->get_id());
|
||||
|
||||
$billing_username = get_post_meta( $c->get_id(),'billing_user_name',true);
|
||||
$customer_email = get_post_meta( $c->get_id(),'customer_email_',true);
|
||||
$coupon_user = array(
|
||||
'post_title' => $username,
|
||||
'post_content' => 'User Name = '.$username.'<br>User Email = '.$useremail.'<br>Giver Name = '. $billing_username .'<br>Giver Email = '. $customer_email,
|
||||
'post_excerpt' => '',
|
||||
'post_status' => 'publish',
|
||||
'post_author' => 1,
|
||||
'post_type' => 'couponuser'
|
||||
);
|
||||
$new_coupon_id = wp_insert_post( $coupon_user );
|
||||
|
||||
add_post_meta( $new_coupon_id, 'username', $username );
|
||||
add_post_meta( $new_coupon_id, 'useremail', $useremail );
|
||||
add_post_meta( $new_coupon_id, 'giver_name', $billing_username );
|
||||
add_post_meta( $new_coupon_id, 'giver_email', $customer_email );
|
||||
|
||||
}
|
||||
|
||||
update_post_meta($order_id,'uses_c',true);
|
||||
|
||||
}
|
||||
// wp_remote_get("http://licenses-manager.com/wp-json/coupon/tracking?coupon_uses=1&site_url=".$site_url);
|
||||
|
||||
|
||||
if(get_post_meta($order_id,'received_coupon_code',true)){
|
||||
return get_post_meta($order_id,'received_coupon_code',true);
|
||||
}
|
||||
|
||||
$coupon_limit = get_option('limit_person_coupon');
|
||||
$discount_amount = get_option('coupon_discount_amount');
|
||||
$coupon_expiry_day = get_option('coupon_expiry_date');
|
||||
|
||||
$coupon_code = substr( "abcdefghijklmnopqrstuvwxyz123456789", mt_rand(0, 50) , 1) .substr( md5( time() ), 1); // Code
|
||||
$coupon_code = substr( $coupon_code, 0,10); // create 10 letters coupon
|
||||
$discount_type = get_option('coupon_discount_type'); // Type: fixed_cart, percent, fixed_product, percent_product
|
||||
$billing_user_name = $order->get_billing_first_name();
|
||||
$user_id = $order->get_user_id();
|
||||
$user_email = $order->get_billing_email();
|
||||
$coupon = array(
|
||||
'post_title' => $coupon_code,
|
||||
'post_content' => '$'.$discount_amount.' off coupon',
|
||||
'post_excerpt' => '$'.$discount_amount.' off coupon',
|
||||
'post_status' => 'publish',
|
||||
'post_type' => 'shop_coupon'
|
||||
);
|
||||
|
||||
$new_coupon_id = wp_insert_post( $coupon );
|
||||
$coupon_publish_date = get_the_date('Y-m-d',$new_coupon_id);
|
||||
$coupon_expiry_date = date('Y-m-d', strtotime($coupon_publish_date. ' + '.$coupon_expiry_day.' Days'));
|
||||
// Add meta
|
||||
update_post_meta( $new_coupon_id, 'discount_type', $discount_type );
|
||||
update_post_meta( $new_coupon_id, 'coupon_amount', $discount_amount );
|
||||
update_post_meta( $new_coupon_id, 'usage_limit', $coupon_limit );
|
||||
update_post_meta( $new_coupon_id, 'customer_email_', $user_email );
|
||||
add_post_meta( $new_coupon_id, 'customer_id', $user_id );
|
||||
update_post_meta( $new_coupon_id, 'expiry_date', $coupon_expiry_date );
|
||||
|
||||
$name = $order->get_billing_first_name() . " ";
|
||||
$name .= $order->get_billing_last_name();
|
||||
|
||||
add_post_meta( $new_coupon_id, 'billing_user_name', $name );
|
||||
|
||||
add_post_meta( $order_id, 'received_coupon_code', $coupon_code );
|
||||
|
||||
wp_remote_get("http://licenses-manager.com/wp-json/coupon/tracking?coupon_uses=1&coupon_generate=1&site_url=".$site_url);
|
||||
|
||||
return $coupon_code;
|
||||
|
||||
}
|
||||
|
||||
public function coupon_add_content_thankyou(){
|
||||
|
||||
$order_id = wc_get_order_id_by_order_key( $_GET['key'] );
|
||||
$order = wc_get_order( $order_id );
|
||||
$user_first_name = $order->get_billing_first_name();
|
||||
$user_last_name = $order->get_billing_last_name();
|
||||
$received_coupon_code = get_post_meta( $order_id, 'received_coupon_code', false);
|
||||
$site_url = get_site_url();
|
||||
$business_name = get_bloginfo();
|
||||
|
||||
foreach($received_coupon_code as $key => $code){
|
||||
$str = get_option('thank_page_text_opt');
|
||||
|
||||
if(!$str){
|
||||
|
||||
$str = "
|
||||
|
||||
<h2>You have got a coupon</h2>
|
||||
Your coupon is {coupon_code}.
|
||||
Website Url is {site_url}.
|
||||
Customer {first_name} {last_name}.
|
||||
Business Name {business_name}.
|
||||
";
|
||||
|
||||
}
|
||||
|
||||
$background_image = get_option('background_image');
|
||||
|
||||
$str = str_replace("{coupon_code}",$code,$str);
|
||||
$str = str_replace("{site_url}",$site_url,$str);
|
||||
$str = str_replace("{first_name}",$user_first_name,$str);
|
||||
$str = str_replace("{last_name}",$user_last_name,$str);
|
||||
$str = str_replace("{business_name}",$business_name,$str);
|
||||
|
||||
|
||||
if($background_image){
|
||||
$background_image = "background-image:url($background_image); background-repeat:no-repeat;background-position:center;background-size: 100% 100%;min-height:400px;";
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
<div id="aw-coupon" style="white-space: pre-line;margin:10px;<?= $background_image?>">
|
||||
<div id="hmd-copy-text">
|
||||
<?= apply_filters('the_content',$str);?>
|
||||
</div>
|
||||
<?php
|
||||
$btn_text_color = get_option('copy_btn_text_color');
|
||||
if(empty($btn_text_color)){
|
||||
$btn_text_color = '#ffffff';
|
||||
}
|
||||
$btn_color = get_option('copy_btn_color');
|
||||
if(empty($btn_color)){
|
||||
$btn_color = '#0274be';
|
||||
}
|
||||
$selected_btn_size = get_option('copy_btn_size');
|
||||
?>
|
||||
<div style="display: flex;align-items: center;">
|
||||
<button id="hmd_copy_text_btn" class="<?= $selected_btn_size ?>" onclick="copyToClipboard('#hmd-copy-text')" style="background-color: <?= $btn_color ?>; color: <?= $btn_text_color ?>; display: inline-block;"><?= get_option('copy_btn_text'); ?></button>
|
||||
<a href="https://web.whatsapp.com/send?text=<?= strip_tags($str) ?>" target="_blank" style="margin-left: 15px;"><button class="<?= $selected_btn_size ?>" style="background-color: <?= $btn_color ?>; color: <?= $btn_text_color ?>;">Share</button></a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function generate_coupon_user_post(){
|
||||
|
||||
|
||||
/*$applied_coupon = WC()->cart->get_applied_coupons();
|
||||
global $woocommerce;
|
||||
$c = new WC_Coupon($applied_coupon[0]);
|
||||
$current_user = wp_get_current_user();
|
||||
$username = $current_user->user_firstname;
|
||||
$get_post_meta = get_post_meta($c->get_id());
|
||||
|
||||
$billing_username = get_post_meta( $c->get_id(),'billing_user_name',true);
|
||||
$customer_email = get_post_meta( $c->get_id(),'customer_email_',true);
|
||||
$coupon_user = array(
|
||||
'post_title' => $username,
|
||||
'post_content' => 'User Name ='.$username.'<br>Giver Name ='. $billing_username .'<br>Giver Email'. $customer_email,
|
||||
'post_excerpt' => '',
|
||||
'post_status' => 'publish',
|
||||
'post_author' => 1,
|
||||
'post_type' => 'couponuser'
|
||||
);
|
||||
// wp_insert_post( $coupon_user );
|
||||
$new_coupon_id = wp_insert_post( $coupon_user );
|
||||
|
||||
add_post_meta( $new_coupon_id, 'username', $username );
|
||||
add_post_meta( $new_coupon_id, 'giver_name', $billing_username );
|
||||
add_post_meta( $new_coupon_id, 'giver_email', $customer_email );
|
||||
*/
|
||||
}
|
||||
public function add_order_email_coupon_details($order, $sent_to_admin){
|
||||
|
||||
$received_coupon_code = get_post_meta( $order->get_id(), 'received_coupon_code', false);
|
||||
$site_url = get_site_url();
|
||||
|
||||
foreach($received_coupon_code as $key => $code){
|
||||
$str = get_option('thank_page_text_opt');
|
||||
$new_arr = explode(".",$str);
|
||||
$new_replace = array($code, $site_url);
|
||||
$new_find = array("{coupon_code}","{site_url}");
|
||||
print_r(str_replace($new_find,$new_replace,$new_arr)[0]);
|
||||
echo '<br>';
|
||||
print_r(str_replace($new_find,$new_replace,$new_arr)[1]);
|
||||
echo '<br>';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
/**
|
||||
* All of the CSS for your public-facing functionality should be
|
||||
* included in this file.
|
||||
*/
|
||||
|
||||
.copy_text_btn_sm{
|
||||
padding: 10px 15px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.copy_text_btn_md{
|
||||
padding: 10px 25px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
.copy_text_btn_lg{
|
||||
padding: 10px 40px;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
<?php // Silence is golden
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
(function( $ ) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* All of the code for your public-facing JavaScript source
|
||||
* should reside in this file.
|
||||
*
|
||||
* Note: It has been assumed you will write jQuery code here, so the
|
||||
* $ function reference has been prepared for usage within the scope
|
||||
* of this function.
|
||||
*
|
||||
* This enables you to define handlers, for when the DOM is ready:
|
||||
*
|
||||
* $(function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* When the window is loaded:
|
||||
*
|
||||
* $( window ).load(function() {
|
||||
*
|
||||
* });
|
||||
*
|
||||
* ...and/or other possibilities.
|
||||
*
|
||||
* Ideally, it is not considered best practise to attach more than a
|
||||
* single DOM-ready or window-load handler for a particular page.
|
||||
* Although scripts in the WordPress core, Plugins and Themes may be
|
||||
* practising this, we should strive to set a better example in our own work.
|
||||
*/
|
||||
|
||||
})( jQuery );
|
||||
|
||||
$= jQuery;
|
||||
|
||||
function copyToClipboard(element) {
|
||||
var $temp = $('<textarea>');
|
||||
$('body').append($temp);
|
||||
$temp.val($(element).text()).select();
|
||||
document.execCommand('copy');
|
||||
$temp.remove();
|
||||
$('#hmd_copy_text_btn').after("<span class='hmd_appended_text'><b>Text Coppied</b></span>");
|
||||
$('#hmd_copy_text_btn').remove();
|
||||
// setTimeout(function(){
|
||||
// $('.hmd_appended_text').remove();
|
||||
// }, 2000);
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Provide a public-facing view for the plugin
|
||||
*
|
||||
* This file is used to markup the public-facing aspects of the plugin.
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
* @subpackage Coupon_Manager/public/partials
|
||||
*/
|
||||
?>
|
||||
|
||||
<!-- This file should primarily consist of HTML with a little bit of PHP. -->
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Fired when the plugin is uninstalled.
|
||||
*
|
||||
* When populating this file, consider the following flow
|
||||
* of control:
|
||||
*
|
||||
* - This method should be static
|
||||
* - Check if the $_REQUEST content actually is the plugin name
|
||||
* - Run an admin referrer check to make sure it goes through authentication
|
||||
* - Verify the output of $_GET makes sense
|
||||
* - Repeat with other user roles. Best directly by using the links/query string parameters.
|
||||
* - Repeat things for multisite. Once for a single site in the network, once sitewide.
|
||||
*
|
||||
* This file may be updated more in future version of the Boilerplate; however, this is the
|
||||
* general skeleton and outline for how the file should work.
|
||||
*
|
||||
* For more information, see the following discussion:
|
||||
* https://github.com/tommcfarlin/WordPress-Plugin-Boilerplate/pull/123#issuecomment-28541913
|
||||
*
|
||||
* @link http://abdulwahab.live/
|
||||
* @since 1.0.0
|
||||
*
|
||||
* @package Coupon_Manager
|
||||
*/
|
||||
|
||||
// If uninstall not called from WordPress, then exit.
|
||||
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
|
||||
exit;
|
||||
}
|
||||
Loading…
Reference in New Issue