233 lines
5.8 KiB
Bash
233 lines
5.8 KiB
Bash
#!/bin/bash
|
|
#
|
|
# WordPress Plugin Validation Script
|
|
# Validates PHP syntax and checks plugin header for WordPress.org compliance
|
|
#
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Plugin root directory
|
|
PLUGIN_DIR="${1:-.}"
|
|
|
|
# Counters
|
|
TOTAL_FILES=0
|
|
ERROR_COUNT=0
|
|
WARNING_COUNT=0
|
|
|
|
echo "================================================"
|
|
echo "WordPress Plugin Validation Script"
|
|
echo "================================================"
|
|
echo ""
|
|
echo "Validating plugin: $PLUGIN_DIR"
|
|
echo ""
|
|
|
|
# Function to check PHP syntax
|
|
check_php_syntax() {
|
|
local file="$1"
|
|
local result=$(php -l "$file" 2>&1)
|
|
|
|
if echo "$result" | grep -q "No syntax errors detected"; then
|
|
echo -e "${GREEN}[PASS]${NC} $file"
|
|
return 0
|
|
else
|
|
echo -e "${RED}[FAIL]${NC} $file"
|
|
echo "$result"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to check plugin header
|
|
check_plugin_header() {
|
|
local file="$1"
|
|
local dir=$(dirname "$file")
|
|
local basename=$(basename "$dir")
|
|
|
|
# Check for required plugin header fields
|
|
if ! grep -q "Plugin Name:" "$file"; then
|
|
echo -e "${RED}[MISSING]${NC} Plugin Name header in $file"
|
|
return 1
|
|
fi
|
|
|
|
if ! grep -q "Version:" "$file"; then
|
|
echo -e "${RED}[MISSING]${NC} Version header in $file"
|
|
return 1
|
|
fi
|
|
|
|
if ! grep -q "Text Domain:" "$file"; then
|
|
echo -e "${YELLOW}[WARNING]${NC} Text Domain header missing in $file"
|
|
return 2
|
|
fi
|
|
|
|
echo -e "${GREEN}[OK]${NC} Plugin header in $file"
|
|
return 0
|
|
}
|
|
|
|
# Function to validate file structure
|
|
validate_structure() {
|
|
local plugin_file="$1"
|
|
local plugin_dir=$(dirname "$plugin_file")
|
|
local plugin_slug=$(basename "$plugin_file" .php)
|
|
|
|
echo ""
|
|
echo "Checking plugin structure..."
|
|
echo ""
|
|
|
|
# Check for required files
|
|
local required_files=(
|
|
"pc-changelog-manager-abc123.php"
|
|
"uninstall.php"
|
|
)
|
|
|
|
local required_dirs=(
|
|
"includes"
|
|
"admin"
|
|
"public"
|
|
)
|
|
|
|
local missing=0
|
|
|
|
for file in "${required_files[@]}"; do
|
|
if [ ! -f "$plugin_dir/$file" ]; then
|
|
echo -e "${RED}[MISSING]${NC} Required file: $file"
|
|
missing=1
|
|
else
|
|
echo -e "${GREEN}[FOUND]${NC} $file"
|
|
fi
|
|
TOTAL_FILES=$((TOTAL_FILES + 1))
|
|
done
|
|
|
|
for dir in "${required_dirs[@]}"; do
|
|
if [ ! -d "$plugin_dir/$dir" ]; then
|
|
echo -e "${RED}[MISSING]${NC} Required directory: $dir"
|
|
missing=1
|
|
else
|
|
echo -e "${GREEN}[FOUND]${NC} $dir/"
|
|
fi
|
|
done
|
|
|
|
if [ $missing -eq 1 ]; then
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Function to find all PHP files
|
|
find_php_files() {
|
|
local dir="$1"
|
|
find "$dir" -name "*.php" -type f
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
# Check if plugin directory exists
|
|
if [ ! -d "$PLUGIN_DIR" ]; then
|
|
echo -e "${RED}[ERROR]${NC} Directory not found: $PLUGIN_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Find the main plugin file
|
|
local main_file=""
|
|
local plugin_slug=""
|
|
|
|
# Look for PHP files with plugin header
|
|
for file in $(find_php_files "$PLUGIN_DIR"); do
|
|
if grep -q "Plugin Name:" "$file" && grep -q "Version:" "$file"; then
|
|
main_file="$file"
|
|
plugin_slug=$(basename "$file" .php)
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -z "$main_file" ]; then
|
|
echo -e "${RED}[ERROR]${NC} No plugin main file found in $PLUGIN_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Main plugin file: $main_file"
|
|
echo "Plugin slug: $plugin_slug"
|
|
echo ""
|
|
|
|
# Validate structure
|
|
validate_structure "$main_file"
|
|
struct_result=$?
|
|
if [ $struct_result -ne 0 ]; then
|
|
ERROR_COUNT=$((ERROR_COUNT + 1))
|
|
fi
|
|
|
|
# Check main plugin header
|
|
check_plugin_header "$main_file"
|
|
header_result=$?
|
|
if [ $header_result -eq 1 ]; then
|
|
ERROR_COUNT=$((ERROR_COUNT + 1))
|
|
elif [ $header_result -eq 2 ]; then
|
|
WARNING_COUNT=$((WARNING_COUNT + 1))
|
|
fi
|
|
|
|
# Find and check all PHP files
|
|
echo ""
|
|
echo "Validating PHP syntax..."
|
|
echo ""
|
|
|
|
while IFS= read -r file; do
|
|
TOTAL_FILES=$((TOTAL_FILES + 1))
|
|
check_php_syntax "$file"
|
|
result=$?
|
|
if [ $result -ne 0 ]; then
|
|
ERROR_COUNT=$((ERROR_COUNT + 1))
|
|
fi
|
|
done < <(find_php_files "$PLUGIN_DIR")
|
|
|
|
# Check for common issues
|
|
echo ""
|
|
echo "Checking for common issues..."
|
|
echo ""
|
|
|
|
# Check for debug statements
|
|
debug_patterns=("var_dump" "print_r" "console.log" "error_log")
|
|
for pattern in "${debug_patterns[@]}"; do
|
|
if grep -rq "$pattern" "$PLUGIN_DIR" --include="*.php" | grep -v "uninstall.php" | grep -v ".git"; then
|
|
echo -e "${YELLOW}[WARNING]${NC} Potential debug statement found: $pattern"
|
|
WARNING_COUNT=$((WARNING_COUNT + 1))
|
|
fi
|
|
done
|
|
|
|
# Check for proper escaping
|
|
if grep -rq "echo \$" "$PLUGIN_DIR" --include="*.php" | grep -v "esc_html\|esc_attr\|esc_url\|esc_textarea"; then
|
|
echo -e "${YELLOW}[WARNING]${NC} Potential missing escaping found"
|
|
WARNING_COUNT=$((WARNING_COUNT + 1))
|
|
fi
|
|
|
|
# Summary
|
|
echo ""
|
|
echo "================================================"
|
|
echo "Validation Summary"
|
|
echo "================================================"
|
|
echo ""
|
|
echo "Total files checked: $TOTAL_FILES"
|
|
echo -e "Errors: ${RED}$ERROR_COUNT${NC}"
|
|
echo -e "Warnings: ${YELLOW}$WARNING_COUNT${NC}"
|
|
echo ""
|
|
|
|
if [ $ERROR_COUNT -gt 0 ]; then
|
|
echo -e "${RED}Validation FAILED${NC}"
|
|
echo "Please fix the errors above."
|
|
exit 1
|
|
elif [ $WARNING_COUNT -gt 0 ]; then
|
|
echo -e "${YELLOW}Validation PASSED with warnings${NC}"
|
|
echo "Review the warnings above."
|
|
exit 0
|
|
else
|
|
echo -e "${GREEN}Validation PASSED${NC}"
|
|
echo "Plugin is ready for use."
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
# Run main function
|
|
main
|