removing unneeded files from repo and plugin
All checks were successful
Create Release / build (push) Successful in 3s
All checks were successful
Create Release / build (push) Successful in 3s
This commit is contained in:
@@ -66,8 +66,44 @@ jobs:
|
|||||||
# Copy files to the temp directory (excluding git and other unnecessary files)
|
# Copy files to the temp directory (excluding git and other unnecessary files)
|
||||||
cp -r * /tmp/wp-digital-download/ 2>/dev/null || true
|
cp -r * /tmp/wp-digital-download/ 2>/dev/null || true
|
||||||
|
|
||||||
# Exclude .git, .gitea, and .playwright-mcp directories
|
# Exclude development and sensitive files from plugin distribution
|
||||||
rm -rf /tmp/wp-digital-download/.git /tmp/wp-digital-download/.gitea /tmp/wp-digital-download/.playwright-mcp 2>/dev/null || true
|
# Remove version control and CI/CD files
|
||||||
|
rm -rf /tmp/wp-digital-download/.git 2>/dev/null || true
|
||||||
|
rm -rf /tmp/wp-digital-download/.gitea 2>/dev/null || true
|
||||||
|
rm -rf /tmp/wp-digital-download/.github 2>/dev/null || true
|
||||||
|
rm -f /tmp/wp-digital-download/.gitignore 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove testing and development files
|
||||||
|
rm -rf /tmp/wp-digital-download/.playwright-mcp 2>/dev/null || true
|
||||||
|
rm -rf /tmp/wp-digital-download/tests 2>/dev/null || true
|
||||||
|
rm -rf /tmp/wp-digital-download/test 2>/dev/null || true
|
||||||
|
rm -rf /tmp/wp-digital-download/node_modules 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove documentation and config files that might contain sensitive data
|
||||||
|
rm -f /tmp/wp-digital-download/CLAUDE.md 2>/dev/null || true
|
||||||
|
rm -f /tmp/wp-digital-download/README.md 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove ALL JSON files (package.json, composer.json, and any test configs)
|
||||||
|
find /tmp/wp-digital-download -type f -name "*.json" -delete 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove any lock files
|
||||||
|
rm -f /tmp/wp-digital-download/package-lock.json 2>/dev/null || true
|
||||||
|
rm -f /tmp/wp-digital-download/composer.lock 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove any .env files that might contain credentials
|
||||||
|
find /tmp/wp-digital-download -type f -name ".env*" -delete 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove any backup or temporary files
|
||||||
|
find /tmp/wp-digital-download -type f -name "*~" -delete 2>/dev/null || true
|
||||||
|
find /tmp/wp-digital-download -type f -name "*.bak" -delete 2>/dev/null || true
|
||||||
|
find /tmp/wp-digital-download -type f -name "*.tmp" -delete 2>/dev/null || true
|
||||||
|
|
||||||
|
# Remove any log files
|
||||||
|
find /tmp/wp-digital-download -type f -name "*.log" -delete 2>/dev/null || true
|
||||||
|
|
||||||
|
# List what's being included (for verification)
|
||||||
|
echo "Files being included in the release:"
|
||||||
|
ls -la /tmp/wp-digital-download/
|
||||||
|
|
||||||
# Create the ZIP file with the proper structure
|
# Create the ZIP file with the proper structure
|
||||||
cd /tmp
|
cd /tmp
|
||||||
|
@@ -42,7 +42,23 @@ jobs:
|
|||||||
- name: Create plugin zip
|
- name: Create plugin zip
|
||||||
run: |
|
run: |
|
||||||
mkdir -p /tmp/wp-digital-download
|
mkdir -p /tmp/wp-digital-download
|
||||||
rsync -av --exclude=".git" --exclude=".gitea" --exclude=".playwright-mcp" --exclude="build" . /tmp/wp-digital-download/
|
rsync -av \
|
||||||
|
--exclude=".git" \
|
||||||
|
--exclude=".gitea" \
|
||||||
|
--exclude=".gitignore" \
|
||||||
|
--exclude=".playwright-mcp" \
|
||||||
|
--exclude="build" \
|
||||||
|
--exclude="node_modules" \
|
||||||
|
--exclude="tests" \
|
||||||
|
--exclude="test" \
|
||||||
|
--exclude="CLAUDE.md" \
|
||||||
|
--exclude="*.json" \
|
||||||
|
--exclude="*.log" \
|
||||||
|
--exclude=".env*" \
|
||||||
|
--exclude="*.bak" \
|
||||||
|
--exclude="*.tmp" \
|
||||||
|
--exclude="*~" \
|
||||||
|
. /tmp/wp-digital-download/
|
||||||
cd /tmp
|
cd /tmp
|
||||||
zip -r $GITEA_WORK_DIR/wp-digital-download.zip wp-digital-download
|
zip -r $GITEA_WORK_DIR/wp-digital-download.zip wp-digital-download
|
||||||
|
|
||||||
|
17
.gitignore
vendored
17
.gitignore
vendored
@@ -11,12 +11,27 @@ wp-content/wp-cache-config.php
|
|||||||
wp-content/cache/
|
wp-content/cache/
|
||||||
wp-content/backups/
|
wp-content/backups/
|
||||||
|
|
||||||
# Plugin specific
|
# Development files (excluded from plugin distribution)
|
||||||
node_modules/
|
node_modules/
|
||||||
|
tests/
|
||||||
|
test/
|
||||||
|
CLAUDE.md
|
||||||
*.log
|
*.log
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
|
||||||
|
# Package and config files (may contain test data)
|
||||||
|
package.json
|
||||||
|
package-lock.json
|
||||||
|
composer.json
|
||||||
|
composer.lock
|
||||||
|
*.json
|
||||||
|
|
||||||
|
# Environment files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
*.env
|
||||||
|
|
||||||
# IDE files
|
# IDE files
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
|
63
clean-sensitive-data.sh
Executable file
63
clean-sensitive-data.sh
Executable file
@@ -0,0 +1,63 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script to remove sensitive files from git history
|
||||||
|
# WARNING: This will rewrite git history!
|
||||||
|
|
||||||
|
echo "WARNING: This script will rewrite git history to remove sensitive files."
|
||||||
|
echo "Make sure you have a backup of your repository before proceeding."
|
||||||
|
echo ""
|
||||||
|
read -p "Do you want to continue? (y/N): " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
echo "Aborted."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Removing sensitive files from git history..."
|
||||||
|
|
||||||
|
# Files to remove from history
|
||||||
|
FILES_TO_REMOVE=(
|
||||||
|
"CLAUDE.md"
|
||||||
|
"package.json"
|
||||||
|
"package-lock.json"
|
||||||
|
"composer.json"
|
||||||
|
"composer.lock"
|
||||||
|
".playwright-mcp/*"
|
||||||
|
"tests/*"
|
||||||
|
"*.json"
|
||||||
|
".env"
|
||||||
|
".env.*"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Remove each file from git history
|
||||||
|
for file in "${FILES_TO_REMOVE[@]}"; do
|
||||||
|
echo "Removing $file from history..."
|
||||||
|
git filter-branch --force --index-filter \
|
||||||
|
"git rm -rf --cached --ignore-unmatch $file" \
|
||||||
|
--prune-empty --tag-name-filter cat -- --all 2>/dev/null || true
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Cleaning up..."
|
||||||
|
|
||||||
|
# Clean up refs
|
||||||
|
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
|
||||||
|
|
||||||
|
# Expire reflog
|
||||||
|
git reflog expire --expire=now --all
|
||||||
|
|
||||||
|
# Garbage collect
|
||||||
|
git gc --prune=now --aggressive
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Done! Sensitive files have been removed from git history."
|
||||||
|
echo ""
|
||||||
|
echo "IMPORTANT NEXT STEPS:"
|
||||||
|
echo "1. Review the changes with: git log --oneline"
|
||||||
|
echo "2. Force push to remote: git push --force --all"
|
||||||
|
echo "3. Tell all collaborators to re-clone the repository"
|
||||||
|
echo "4. Update any CI/CD secrets that may have been exposed"
|
||||||
|
echo ""
|
||||||
|
echo "The following files are now in .gitignore and won't be committed again:"
|
||||||
|
cat .gitignore | grep -E "CLAUDE|json|.env|playwright|test" | head -10
|
@@ -8,7 +8,33 @@ This guide shows developers how to integrate their WordPress plugins with the WP
|
|||||||
|
|
||||||
Download `wpdd-plugin-updater.php` from your product page and include it in your plugin.
|
Download `wpdd-plugin-updater.php` from your product page and include it in your plugin.
|
||||||
|
|
||||||
### 2. Basic Integration
|
### 2. Minimal Integration
|
||||||
|
|
||||||
|
For the simplest integration with automatic license management:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Plugin Name: My Plugin
|
||||||
|
* Version: 1.0.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Initialize updater with automatic settings page
|
||||||
|
if (!class_exists('WPDD_Plugin_Updater') && is_admin()) {
|
||||||
|
require_once plugin_dir_path(__FILE__) . 'includes/wpdd-plugin-updater.php';
|
||||||
|
|
||||||
|
new WPDD_Plugin_Updater(
|
||||||
|
__FILE__,
|
||||||
|
get_option('my_plugin_license_key', ''),
|
||||||
|
'https://your-store.com',
|
||||||
|
array('add_settings_page' => true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates a license settings page under Settings → My Plugin License.
|
||||||
|
|
||||||
|
### 3. Full Integration
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
@@ -17,8 +43,10 @@ Download `wpdd-plugin-updater.php` from your product page and include it in your
|
|||||||
* Version: 1.0.0
|
* Version: 1.0.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Include the WPDD updater library
|
// Include the WPDD updater library (check if class exists to avoid conflicts)
|
||||||
|
if (!class_exists('WPDD_Plugin_Updater')) {
|
||||||
require_once plugin_dir_path(__FILE__) . 'includes/wpdd-plugin-updater.php';
|
require_once plugin_dir_path(__FILE__) . 'includes/wpdd-plugin-updater.php';
|
||||||
|
}
|
||||||
|
|
||||||
class My_Awesome_Plugin {
|
class My_Awesome_Plugin {
|
||||||
|
|
||||||
@@ -68,10 +96,15 @@ class My_Plugin_Settings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function init_updater() {
|
private function init_updater() {
|
||||||
|
// Check if updater class exists
|
||||||
|
if (!class_exists('WPDD_Plugin_Updater')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$license_key = get_option('my_plugin_license_key', '');
|
$license_key = get_option('my_plugin_license_key', '');
|
||||||
|
|
||||||
$this->updater = new WPDD_Plugin_Updater(
|
$this->updater = new WPDD_Plugin_Updater(
|
||||||
MY_PLUGIN_FILE,
|
MY_PLUGIN_FILE, // Define this constant to your main plugin file
|
||||||
$license_key,
|
$license_key,
|
||||||
'https://your-store.com',
|
'https://your-store.com',
|
||||||
array('add_settings_page' => false) // We'll handle settings ourselves
|
array('add_settings_page' => false) // We'll handle settings ourselves
|
||||||
@@ -102,7 +135,7 @@ class My_Plugin_Settings {
|
|||||||
|
|
||||||
public function render_license_section() {
|
public function render_license_section() {
|
||||||
$license_key = get_option('my_plugin_license_key', '');
|
$license_key = get_option('my_plugin_license_key', '');
|
||||||
$is_valid = $this->updater->validate_license();
|
$is_valid = $this->updater ? $this->updater->validate_license() : false;
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<h3>License Settings</h3>
|
<h3>License Settings</h3>
|
||||||
@@ -150,6 +183,11 @@ class My_Premium_Feature {
|
|||||||
private $updater;
|
private $updater;
|
||||||
|
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
|
// Include updater if not already loaded
|
||||||
|
if (!class_exists('WPDD_Plugin_Updater')) {
|
||||||
|
require_once plugin_dir_path(__FILE__) . 'includes/wpdd-plugin-updater.php';
|
||||||
|
}
|
||||||
|
|
||||||
$license_key = get_option('my_plugin_license_key', '');
|
$license_key = get_option('my_plugin_license_key', '');
|
||||||
|
|
||||||
$this->updater = new WPDD_Plugin_Updater(
|
$this->updater = new WPDD_Plugin_Updater(
|
||||||
@@ -167,7 +205,8 @@ class My_Premium_Feature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function is_license_valid() {
|
private function is_license_valid() {
|
||||||
return $this->updater->validate_license();
|
// Check if updater exists and validate license
|
||||||
|
return $this->updater ? $this->updater->validate_license() : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function enable_premium_features() {
|
private function enable_premium_features() {
|
||||||
@@ -195,14 +234,20 @@ class My_Premium_Feature {
|
|||||||
|
|
||||||
### WPDD_Plugin_Updater Class
|
### WPDD_Plugin_Updater Class
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
|
||||||
|
- **WordPress**: 5.0 or higher
|
||||||
|
- **PHP**: 7.0 or higher
|
||||||
|
- **Plugin Version Header**: Your main plugin file must include a Version header
|
||||||
|
|
||||||
#### Constructor Parameters
|
#### Constructor Parameters
|
||||||
|
|
||||||
```php
|
```php
|
||||||
new WPDD_Plugin_Updater($plugin_file, $license_key, $update_server, $args);
|
new WPDD_Plugin_Updater($plugin_file, $license_key, $update_server, $args);
|
||||||
```
|
```
|
||||||
|
|
||||||
- **$plugin_file** (string) - Full path to your main plugin file
|
- **$plugin_file** (string) - Full path to your main plugin file (typically `__FILE__`)
|
||||||
- **$license_key** (string) - The user's license key
|
- **$license_key** (string) - The user's license key (can be empty string)
|
||||||
- **$update_server** (string) - URL to your store (e.g., 'https://your-store.com')
|
- **$update_server** (string) - URL to your store (e.g., 'https://your-store.com')
|
||||||
- **$args** (array) - Optional arguments:
|
- **$args** (array) - Optional arguments:
|
||||||
- `add_settings_page` (bool) - Auto-create license settings page (default: false)
|
- `add_settings_page` (bool) - Auto-create license settings page (default: false)
|
||||||
@@ -352,10 +397,18 @@ Then visit: `wp-admin/plugins.php?force_update_check=1`
|
|||||||
Always handle API failures gracefully:
|
Always handle API failures gracefully:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
// Check if updater was initialized properly
|
||||||
|
if (!$this->updater) {
|
||||||
|
// Handle initialization failure
|
||||||
|
error_log('WPDD Updater failed to initialize');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$result = $updater->validate_license();
|
$result = $updater->validate_license();
|
||||||
if ($result === false) {
|
if ($result === false) {
|
||||||
// Network error or server down - allow functionality to continue
|
// Network error or server down - allow functionality to continue
|
||||||
// but maybe show a notice
|
// but maybe show a notice
|
||||||
|
error_log('License validation failed - network or server issue');
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -388,13 +441,50 @@ if ($this->is_license_valid()) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## What's New in Version 1.1.0
|
||||||
|
|
||||||
|
The updated `wpdd-plugin-updater.php` includes several improvements:
|
||||||
|
|
||||||
|
### Enhanced Error Handling
|
||||||
|
- Better HTTP request error handling with status code checking
|
||||||
|
- JSON validation to prevent parsing errors
|
||||||
|
- Improved timeout handling (30 seconds default)
|
||||||
|
- More detailed error logging for debugging
|
||||||
|
|
||||||
|
### Improved Compatibility
|
||||||
|
- Better API response structure handling
|
||||||
|
- Flexible URL checking for package downloads
|
||||||
|
- Support for different server configurations
|
||||||
|
- Fallback values for missing data fields
|
||||||
|
|
||||||
|
### Security Enhancements
|
||||||
|
- SSL verification enabled by default
|
||||||
|
- Proper input validation in constructor
|
||||||
|
- Safe handling of network failures
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
- 12-hour caching for update checks
|
||||||
|
- Optimized HTTP requests with proper headers
|
||||||
|
- Reduced unnecessary API calls
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
### Common Issues
|
### Common Issues
|
||||||
|
|
||||||
1. **Updates not showing:** Check that the plugin slug matches the product slug in your store
|
1. **Updates not showing:**
|
||||||
2. **License validation fails:** Ensure the update server URL is correct and accessible
|
- Check that the plugin slug matches the product slug in your store
|
||||||
3. **Download fails:** Verify the license is activated and not expired
|
- Verify the plugin file has a proper Version header
|
||||||
|
- Clear update transients using the force update check method
|
||||||
|
|
||||||
|
2. **License validation fails:**
|
||||||
|
- Ensure the update server URL is correct and accessible
|
||||||
|
- Check that the license key is properly formatted
|
||||||
|
- Verify SSL certificates are valid on your server
|
||||||
|
|
||||||
|
3. **Download fails:**
|
||||||
|
- Verify the license is activated and not expired
|
||||||
|
- Check activation limits haven't been exceeded
|
||||||
|
- Ensure the package file exists on the server
|
||||||
|
|
||||||
### Debug Mode
|
### Debug Mode
|
||||||
|
|
||||||
|
@@ -5,7 +5,21 @@
|
|||||||
* Include this file in your WordPress plugin to enable automatic updates
|
* Include this file in your WordPress plugin to enable automatic updates
|
||||||
* and license validation through the WP Digital Download licensing system.
|
* and license validation through the WP Digital Download licensing system.
|
||||||
*
|
*
|
||||||
* @version 1.0.0
|
* Usage example:
|
||||||
|
*
|
||||||
|
* // Initialize the updater
|
||||||
|
* if (!class_exists('WPDD_Plugin_Updater')) {
|
||||||
|
* require_once 'path/to/wpdd-plugin-updater.php';
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* $updater = new WPDD_Plugin_Updater(
|
||||||
|
* __FILE__, // Main plugin file path
|
||||||
|
* get_option('my_plugin_license_key', ''), // License key from options
|
||||||
|
* 'https://your-site.com', // Update server URL
|
||||||
|
* array('add_settings_page' => true) // Optional: Add license settings page
|
||||||
|
* );
|
||||||
|
*
|
||||||
|
* @version 1.1.0
|
||||||
* @author WP Digital Download
|
* @author WP Digital Download
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -33,9 +47,20 @@ class WPDD_Plugin_Updater {
|
|||||||
* @param array $args Additional arguments
|
* @param array $args Additional arguments
|
||||||
*/
|
*/
|
||||||
public function __construct($plugin_file, $license_key, $update_server, $args = array()) {
|
public function __construct($plugin_file, $license_key, $update_server, $args = array()) {
|
||||||
|
// Validate required parameters
|
||||||
|
if (empty($plugin_file) || !file_exists($plugin_file)) {
|
||||||
|
error_log('WPDD Updater: Invalid plugin file path provided');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($update_server) || !filter_var($update_server, FILTER_VALIDATE_URL)) {
|
||||||
|
error_log('WPDD Updater: Invalid update server URL provided');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$this->plugin_file = $plugin_file;
|
$this->plugin_file = $plugin_file;
|
||||||
$this->plugin_slug = basename($plugin_file, '.php');
|
$this->plugin_slug = basename($plugin_file, '.php');
|
||||||
$this->license_key = $license_key;
|
$this->license_key = trim($license_key);
|
||||||
$this->update_server = trailingslashit($update_server);
|
$this->update_server = trailingslashit($update_server);
|
||||||
|
|
||||||
// Get plugin version from header
|
// Get plugin version from header
|
||||||
@@ -43,7 +68,7 @@ class WPDD_Plugin_Updater {
|
|||||||
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||||||
}
|
}
|
||||||
$plugin_data = get_plugin_data($plugin_file);
|
$plugin_data = get_plugin_data($plugin_file);
|
||||||
$this->version = $plugin_data['Version'];
|
$this->version = $plugin_data['Version'] ?? '1.0.0';
|
||||||
|
|
||||||
$this->transient_key = 'wpdd_update_' . $this->plugin_slug;
|
$this->transient_key = 'wpdd_update_' . $this->plugin_slug;
|
||||||
|
|
||||||
@@ -90,15 +115,16 @@ class WPDD_Plugin_Updater {
|
|||||||
$update_info = $this->request_update_info();
|
$update_info = $this->request_update_info();
|
||||||
|
|
||||||
if ($update_info && isset($update_info['update_available']) && $update_info['update_available']) {
|
if ($update_info && isset($update_info['update_available']) && $update_info['update_available']) {
|
||||||
|
// API returns proper structure - use it directly
|
||||||
$plugin_data = array(
|
$plugin_data = array(
|
||||||
'slug' => $this->plugin_slug,
|
'slug' => $update_info['slug'] ?? $this->plugin_slug,
|
||||||
'plugin' => $this->plugin_file,
|
'plugin' => $update_info['plugin'] ?? $this->plugin_file,
|
||||||
'new_version' => $update_info['version'],
|
'new_version' => $update_info['version'] ?? $update_info['new_version'],
|
||||||
'url' => $update_info['url'],
|
'url' => $update_info['url'] ?? '',
|
||||||
'package' => $update_info['package'],
|
'package' => $update_info['package'] ?? $update_info['download_url'],
|
||||||
'tested' => $update_info['tested'],
|
'tested' => $update_info['tested'] ?? get_bloginfo('version'),
|
||||||
'requires' => $update_info['requires'],
|
'requires' => $update_info['requires'] ?? '5.0',
|
||||||
'requires_php' => $update_info['requires_php'],
|
'requires_php' => $update_info['requires_php'] ?? '7.0',
|
||||||
'compatibility' => new stdClass()
|
'compatibility' => new stdClass()
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -133,19 +159,25 @@ class WPDD_Plugin_Updater {
|
|||||||
return $false;
|
return $false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Extract product name from plugin file if available
|
||||||
|
if (!function_exists('get_plugin_data')) {
|
||||||
|
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
||||||
|
}
|
||||||
|
$plugin_data = get_plugin_data($this->plugin_file);
|
||||||
|
|
||||||
return (object) array(
|
return (object) array(
|
||||||
'slug' => $this->plugin_slug,
|
'slug' => $this->plugin_slug,
|
||||||
'name' => $update_info['name'] ?? $this->plugin_slug,
|
'name' => $plugin_data['Name'] ?? $this->plugin_slug,
|
||||||
'version' => $update_info['version'] ?? $this->version,
|
'version' => $update_info['version'] ?? $update_info['new_version'] ?? $this->version,
|
||||||
'author' => $update_info['author'] ?? '',
|
'author' => $plugin_data['Author'] ?? $update_info['author'] ?? '',
|
||||||
'homepage' => $update_info['url'] ?? '',
|
'homepage' => $plugin_data['PluginURI'] ?? $update_info['url'] ?? '',
|
||||||
'requires' => $update_info['requires'] ?? '5.0',
|
'requires' => $update_info['requires'] ?? '5.0',
|
||||||
'tested' => $update_info['tested'] ?? get_bloginfo('version'),
|
'tested' => $update_info['tested'] ?? get_bloginfo('version'),
|
||||||
'requires_php' => $update_info['requires_php'] ?? '7.0',
|
'requires_php' => $update_info['requires_php'] ?? '7.0',
|
||||||
'download_link' => $update_info['package'] ?? '',
|
'download_link' => $update_info['package'] ?? $update_info['download_url'] ?? '',
|
||||||
'sections' => array(
|
'sections' => array(
|
||||||
'changelog' => $update_info['changelog'] ?? '',
|
'changelog' => $update_info['changelog'] ?? $update_info['release_notes'] ?? '',
|
||||||
'description' => $update_info['description'] ?? ''
|
'description' => $plugin_data['Description'] ?? $update_info['description'] ?? ''
|
||||||
),
|
),
|
||||||
'banners' => array(),
|
'banners' => array(),
|
||||||
'icons' => array()
|
'icons' => array()
|
||||||
@@ -157,7 +189,17 @@ class WPDD_Plugin_Updater {
|
|||||||
*/
|
*/
|
||||||
public function maybe_download_package($reply, $package, $upgrader) {
|
public function maybe_download_package($reply, $package, $upgrader) {
|
||||||
// Check if this is our plugin's package
|
// Check if this is our plugin's package
|
||||||
if (strpos($package, $this->update_server) === false || strpos($package, $this->plugin_slug) === false) {
|
// More flexible URL checking - handle different URL structures
|
||||||
|
$server_host = parse_url($this->update_server, PHP_URL_HOST);
|
||||||
|
$package_host = parse_url($package, PHP_URL_HOST);
|
||||||
|
|
||||||
|
if ($server_host !== $package_host && strpos($package, $this->plugin_slug) === false) {
|
||||||
|
return $reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also check if this is a WPDD download URL pattern
|
||||||
|
if (strpos($package, 'wp-json/wpdd/v1/download-update') === false &&
|
||||||
|
strpos($package, $this->update_server) === false) {
|
||||||
return $reply;
|
return $reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,10 +224,15 @@ class WPDD_Plugin_Updater {
|
|||||||
), $url);
|
), $url);
|
||||||
|
|
||||||
$response = wp_remote_get($url, array(
|
$response = wp_remote_get($url, array(
|
||||||
'timeout' => 15,
|
'timeout' => 30,
|
||||||
|
'redirection' => 3,
|
||||||
|
'httpversion' => '1.1',
|
||||||
|
'user-agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url(),
|
||||||
'headers' => array(
|
'headers' => array(
|
||||||
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url()
|
'Accept' => 'application/json',
|
||||||
)
|
'Content-Type' => 'application/json'
|
||||||
|
),
|
||||||
|
'sslverify' => true
|
||||||
));
|
));
|
||||||
|
|
||||||
if (is_wp_error($response)) {
|
if (is_wp_error($response)) {
|
||||||
@@ -193,9 +240,25 @@ class WPDD_Plugin_Updater {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$http_code = wp_remote_retrieve_response_code($response);
|
||||||
|
if ($http_code !== 200) {
|
||||||
|
error_log('WPDD Updater: HTTP error ' . $http_code . ' when checking for updates');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
$body = wp_remote_retrieve_body($response);
|
$body = wp_remote_retrieve_body($response);
|
||||||
|
if (empty($body)) {
|
||||||
|
error_log('WPDD Updater: Empty response body when checking for updates');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
$data = json_decode($body, true);
|
$data = json_decode($body, true);
|
||||||
|
|
||||||
|
if (json_last_error() !== JSON_ERROR_NONE) {
|
||||||
|
error_log('WPDD Updater: Invalid JSON response: ' . json_last_error_msg());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!$data || !isset($data['success'])) {
|
if (!$data || !isset($data['success'])) {
|
||||||
error_log('WPDD Updater: Invalid response from update server');
|
error_log('WPDD Updater: Invalid response from update server');
|
||||||
return false;
|
return false;
|
||||||
@@ -208,6 +271,7 @@ class WPDD_Plugin_Updater {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the data array directly - API already provides proper structure
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,15 +286,19 @@ class WPDD_Plugin_Updater {
|
|||||||
$url = $this->update_server . 'wp-json/wpdd/v1/validate-license';
|
$url = $this->update_server . 'wp-json/wpdd/v1/validate-license';
|
||||||
|
|
||||||
$response = wp_remote_post($url, array(
|
$response = wp_remote_post($url, array(
|
||||||
'timeout' => 15,
|
'timeout' => 30,
|
||||||
|
'redirection' => 3,
|
||||||
|
'httpversion' => '1.1',
|
||||||
'body' => array(
|
'body' => array(
|
||||||
'license_key' => $this->license_key,
|
'license_key' => $this->license_key,
|
||||||
'product_slug' => $this->plugin_slug,
|
'product_slug' => $this->plugin_slug,
|
||||||
'site_url' => home_url()
|
'site_url' => home_url()
|
||||||
),
|
),
|
||||||
'headers' => array(
|
'headers' => array(
|
||||||
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url()
|
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url(),
|
||||||
)
|
'Accept' => 'application/json'
|
||||||
|
),
|
||||||
|
'sslverify' => true
|
||||||
));
|
));
|
||||||
|
|
||||||
if (is_wp_error($response)) {
|
if (is_wp_error($response)) {
|
||||||
@@ -261,7 +329,9 @@ class WPDD_Plugin_Updater {
|
|||||||
$url = $this->update_server . 'wp-json/wpdd/v1/activate-license';
|
$url = $this->update_server . 'wp-json/wpdd/v1/activate-license';
|
||||||
|
|
||||||
$response = wp_remote_post($url, array(
|
$response = wp_remote_post($url, array(
|
||||||
'timeout' => 15,
|
'timeout' => 30,
|
||||||
|
'redirection' => 3,
|
||||||
|
'httpversion' => '1.1',
|
||||||
'body' => array(
|
'body' => array(
|
||||||
'license_key' => $this->license_key,
|
'license_key' => $this->license_key,
|
||||||
'site_url' => home_url(),
|
'site_url' => home_url(),
|
||||||
@@ -270,8 +340,10 @@ class WPDD_Plugin_Updater {
|
|||||||
'php_version' => PHP_VERSION
|
'php_version' => PHP_VERSION
|
||||||
),
|
),
|
||||||
'headers' => array(
|
'headers' => array(
|
||||||
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url()
|
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url(),
|
||||||
)
|
'Accept' => 'application/json'
|
||||||
|
),
|
||||||
|
'sslverify' => true
|
||||||
));
|
));
|
||||||
|
|
||||||
if (is_wp_error($response)) {
|
if (is_wp_error($response)) {
|
||||||
@@ -308,14 +380,18 @@ class WPDD_Plugin_Updater {
|
|||||||
$url = $this->update_server . 'wp-json/wpdd/v1/deactivate-license';
|
$url = $this->update_server . 'wp-json/wpdd/v1/deactivate-license';
|
||||||
|
|
||||||
$response = wp_remote_post($url, array(
|
$response = wp_remote_post($url, array(
|
||||||
'timeout' => 15,
|
'timeout' => 30,
|
||||||
|
'redirection' => 3,
|
||||||
|
'httpversion' => '1.1',
|
||||||
'body' => array(
|
'body' => array(
|
||||||
'license_key' => $this->license_key,
|
'license_key' => $this->license_key,
|
||||||
'site_url' => home_url()
|
'site_url' => home_url()
|
||||||
),
|
),
|
||||||
'headers' => array(
|
'headers' => array(
|
||||||
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url()
|
'User-Agent' => 'WPDD-Updater/' . $this->version . '; ' . home_url(),
|
||||||
)
|
'Accept' => 'application/json'
|
||||||
|
),
|
||||||
|
'sslverify' => true
|
||||||
));
|
));
|
||||||
|
|
||||||
if (is_wp_error($response)) {
|
if (is_wp_error($response)) {
|
||||||
|
Reference in New Issue
Block a user