Compare commits

...
10 Commits
Author SHA1 Message Date
magdev d71f2c01dc fixed markdown syntax 2025-12-30 01:34:46 +01:00
magdev 82c8008fed added wp-core symlink 2025-12-30 01:33:24 +01:00
magdev 4871b7957d added skills to end sessions 2025-12-30 01:32:03 +01:00
magdevandClaude Sonnet 4.5 f7508a3d9c Document v1.2.8 learnings in CLAUDE.md
Added two new critical sections documenting lessons learned during v1.2.8 development:

1. Currency Symbol Display
   - Proper pattern for displaying currency in table headers using printf()
   - How to pass currency_symbol to Twig templates
   - Correct concatenation in Twig placeholders
   - List of affected render methods

2. Post Meta Deletion vs. Empty Arrays
   - Explains WordPress distinction between deleted meta and empty arrays
   - Shows wrong pattern (saving empty arrays) vs correct pattern (deleting meta)
   - Why this matters for database cleanliness and bug prevention
   - Affected methods in save_tier_package_fields() and save_variation_pricing_fields()

These patterns prevent future bugs and ensure consistent implementation across the codebase.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-30 01:31:11 +01:00
magdevandClaude Sonnet 4.5 23f81ce58c Add v1.2.8 release package and checksums
- Release package: wc-tier-and-package-prices-1.2.8.zip (440KB, 383 files)
- MD5: d412c85ef32b2e79e17227749265919f
- SHA256: 0c47e2a966c485b377beaffb56703a130158a15e7ffe9d95b43dea84f9229e9c

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-30 01:29:10 +01:00
magdev 9e96ff3321 Merge branch 'dev' 2025-12-30 01:28:09 +01:00
magdev d7a61f29b4 Merge branch 'dev' 2025-12-30 01:05:21 +01:00
magdev 71ea40598f Merge branch 'dev' 2025-12-30 00:48:46 +01:00
magdev a73ff4926f Merge branch 'dev' 2025-12-30 00:38:33 +01:00
magdevandClaude Sonnet 4.5 e4747130e4 Add release package for version 1.2.5
Release package includes:
- Parent product default pricing for variable products
- Hide empty table headers in admin area
- Package size: 433KB (383 files)
- Checksums: MD5 and SHA256 generated

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-30 00:25:14 +01:00
9 changed files with 110 additions and 1 deletions

No files matched your search

+3 -1
View File
@@ -40,7 +40,9 @@
"Bash('wc-tier-and-package-prices/templates/cache/*' )", "Bash('wc-tier-and-package-prices/templates/cache/*' )",
"Bash('wc-tier-and-package-prices/composer.lock' )", "Bash('wc-tier-and-package-prices/composer.lock' )",
"Bash('*/wordpress/*')", "Bash('*/wordpress/*')",
"Bash(echo:*)" "Bash(echo:*)",
"Skill(fix-session)",
"Skill(fix-session:*)"
] ]
} }
} }
+1
View File
@@ -32,3 +32,4 @@ notes.*
# local code # local code
wordpress wordpress
core
+102
View File
@@ -546,11 +546,13 @@ When modifying admin input fields in Twig templates, use WooCommerce's standard
**CRITICAL LESSON from v1.2.4:** WooCommerce's core admin CSS uses high-specificity selectors that require `!important` to override. **CRITICAL LESSON from v1.2.4:** WooCommerce's core admin CSS uses high-specificity selectors that require `!important` to override.
**Problem Symptoms:** **Problem Symptoms:**
- CSS rules not applying despite correct selectors - CSS rules not applying despite correct selectors
- Styles work in simple cases but fail with WooCommerce elements - Styles work in simple cases but fail with WooCommerce elements
- Browser DevTools shows rule crossed out or overridden - Browser DevTools shows rule crossed out or overridden
**Diagnostic Steps:** **Diagnostic Steps:**
1. Inspect element in browser DevTools 1. Inspect element in browser DevTools
2. Check "Computed" tab to see which styles are actually applied 2. Check "Computed" tab to see which styles are actually applied
3. Look for crossed-out rules in "Styles" tab (indicates override) 3. Look for crossed-out rules in "Styles" tab (indicates override)
@@ -559,6 +561,7 @@ When modifying admin input fields in Twig templates, use WooCommerce's standard
**Solution Patterns:** **Solution Patterns:**
**For Table Styling:** **For Table Styling:**
```css ```css
/* ❌ This will likely be overridden */ /* ❌ This will likely be overridden */
.wc-tpp-tiers-table { .wc-tpp-tiers-table {
@@ -582,6 +585,7 @@ When modifying admin input fields in Twig templates, use WooCommerce's standard
``` ```
**For Float-Based Layouts:** **For Float-Based Layouts:**
```css ```css
/* ❌ Float positioning is hard to control precisely */ /* ❌ Float positioning is hard to control precisely */
.woocommerce-help-tip { .woocommerce-help-tip {
@@ -606,6 +610,7 @@ label[for="_wc_tpp_restrict_to_packages"] {
``` ```
**General Rules:** **General Rules:**
1. **Always test in actual WordPress admin** - browser preview may not show WooCommerce's CSS 1. **Always test in actual WordPress admin** - browser preview may not show WooCommerce's CSS
2. **Target all related elements** - tables require styling on `table`, `thead`, `tbody`, `tr`, `th`, `td` 2. **Target all related elements** - tables require styling on `table`, `thead`, `tbody`, `tr`, `th`, `td`
3. **Use `!important` sparingly but don't fear it** - sometimes it's the only way to override WooCommerce core 3. **Use `!important` sparingly but don't fear it** - sometimes it's the only way to override WooCommerce core
@@ -613,6 +618,7 @@ label[for="_wc_tpp_restrict_to_packages"] {
5. **Check across browsers** - table rendering can vary between Chrome/Firefox/Safari 5. **Check across browsers** - table rendering can vary between Chrome/Firefox/Safari
**When Styles Don't Apply:** **When Styles Don't Apply:**
- First verify selector is correct (DevTools should show rule, even if crossed out) - First verify selector is correct (DevTools should show rule, even if crossed out)
- If selector is correct but crossed out, increase specificity or add `!important` - If selector is correct but crossed out, increase specificity or add `!important`
- If selector doesn't appear at all, check file is enqueued and cache is cleared - If selector doesn't appear at all, check file is enqueued and cache is cleared
@@ -809,6 +815,102 @@ WooCommerce has different hooks for different product types in the admin product
**Lesson:** When adding admin UI for variable product parents, use `woocommerce_product_options_general_product_data` and check `$product->is_type('variable')` to conditionally display. Using `woocommerce_product_options_pricing` will cause forms to never appear for variable products (as discovered in v1.2.6 → v1.2.7 fix). **Lesson:** When adding admin UI for variable product parents, use `woocommerce_product_options_general_product_data` and check `$product->is_type('variable')` to conditionally display. Using `woocommerce_product_options_pricing` will cause forms to never appear for variable products (as discovered in v1.2.6 → v1.2.7 fix).
#### CRITICAL: Currency Symbol Display (Learned in v1.2.8)
When displaying currency symbols in admin interface table headers and input placeholders:
**Table Headers:**
```php
// ✅ Correct - Use printf with translation and WooCommerce currency function
<th><?php printf(__('Price (%s)', 'wc-tier-package-prices'), get_woocommerce_currency_symbol()); ?></th>
// ❌ Wrong - Hard-coded or missing currency
<th><?php _e('Price', 'wc-tier-package-prices'); ?></th>
<th><?php _e('Price (€)', 'wc-tier-package-prices'); ?></th>
```
**Twig Template Placeholders:**
```twig
{# ✅ Correct - Pass currency_symbol from PHP and concatenate in template #}
placeholder="{{ ('e.g., 9.99 ' ~ currency_symbol)|__('wc-tier-package-prices') }}"
{# ❌ Wrong - Hard-coded or missing currency #}
placeholder="{{ 'e.g., 9.99'|__('wc-tier-package-prices') }}"
placeholder="{{ 'e.g., 9.99 €'|__('wc-tier-package-prices') }}"
```
**Implementation Pattern:**
1. In PHP render methods, pass currency symbol to Twig: `'currency_symbol' => get_woocommerce_currency_symbol()`
2. In Twig templates, concatenate using `~` operator: `'text ' ~ currency_symbol`
3. Always use WooCommerce's `get_woocommerce_currency_symbol()` - never hard-code currency symbols
**Affected Methods:** All template render methods must pass `currency_symbol`:
- `render_tier_row()`
- `render_package_row()`
- `render_variation_tier_row()`
- `render_variation_package_row()`
#### CRITICAL: Post Meta Deletion vs. Empty Arrays (Learned in v1.2.8)
When saving product meta data, WordPress distinguishes between "no data" (deleted meta) and "empty data" (empty array saved as meta):
**Problem Pattern:**
```php
// ❌ WRONG - Saves empty array when all entries removed
if (isset($_POST['_wc_tpp_tiers'])) {
$tiers = array();
foreach ($_POST['_wc_tpp_tiers'] as $tier) {
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
$tiers[] = array(...);
}
}
update_post_meta($post_id, '_wc_tpp_tiers', $tiers); // Saves [] if no valid entries
} else {
delete_post_meta($post_id, '_wc_tpp_tiers');
}
```
**Correct Pattern:**
```php
// ✅ CORRECT - Deletes meta when no valid entries exist
if (isset($_POST['_wc_tpp_tiers'])) {
$tiers = array();
foreach ($_POST['_wc_tpp_tiers'] as $tier) {
if (!empty($tier['min_qty']) && !empty($tier['price'])) {
$tiers[] = array(...);
}
}
// Only save if we have valid entries, otherwise delete
if (!empty($tiers)) {
update_post_meta($post_id, '_wc_tpp_tiers', $tiers);
} else {
delete_post_meta($post_id, '_wc_tpp_tiers');
}
} else {
delete_post_meta($post_id, '_wc_tpp_tiers');
}
```
**Why This Matters:**
- Empty arrays `[]` saved via `update_post_meta()` persist in database as serialized empty arrays
- Frontend/cart code checking `if ($tiers)` will evaluate `[]` as falsy, but meta still exists in database
- Database queries like `get_post_meta()` return `[]` instead of `false`, causing subtle bugs
- Properly deleting meta keeps database clean and prevents "ghost" configurations
**Affected Methods in v1.2.8:**
- `save_tier_package_fields()` - Simple and variable parent products
- `save_variation_pricing_fields()` - Individual variations
**Rule:** Always check `if (!empty($array))` before calling `update_post_meta()` for array data. If empty, call `delete_post_meta()` instead.
### When Adding Features ### When Adding Features
- Follow the existing pattern: add setting → add UI → add logic → add template - Follow the existing pattern: add setting → add UI → add logic → add template
Binary file not shown.
@@ -0,0 +1 @@
61eafd6c2fdd1468c486efe0c6e3bfa4 wc-tier-and-package-prices-1.2.5.zip
@@ -0,0 +1 @@
4f6d637713511db061dd2db5f948b846eb48c343d9b8823299b85038ccca6a6e wc-tier-and-package-prices-1.2.5.zip
Binary file not shown.
@@ -0,0 +1 @@
d412c85ef32b2e79e17227749265919f wc-tier-and-package-prices-1.2.8.zip
@@ -0,0 +1 @@
0c47e2a966c485b377beaffb56703a130158a15e7ffe9d95b43dea84f9229e9c wc-tier-and-package-prices-1.2.8.zip