feat(adsense): add exclusion system support (Plan 99.11)
- Add _page_visibility fields to FieldMapper - Add _exclusions fields to FieldMapper - Add page visibility checkboxes to FormBuilder - Add ExclusionFormPartial integration 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -105,6 +105,19 @@ final class AdsensePlacementFieldMapper implements FieldMapperInterface
|
|||||||
'adsense-placementSearchBetweenFormat' => ['group' => 'search_results', 'attribute' => 'search_between_format'],
|
'adsense-placementSearchBetweenFormat' => ['group' => 'search_results', 'attribute' => 'search_between_format'],
|
||||||
'adsense-placementSearchBetweenPosition' => ['group' => 'search_results', 'attribute' => 'search_between_position'],
|
'adsense-placementSearchBetweenPosition' => ['group' => 'search_results', 'attribute' => 'search_between_position'],
|
||||||
'adsense-placementSearchBetweenEvery' => ['group' => 'search_results', 'attribute' => 'search_between_every'],
|
'adsense-placementSearchBetweenEvery' => ['group' => 'search_results', 'attribute' => 'search_between_every'],
|
||||||
|
|
||||||
|
// Page Visibility (grupo especial _page_visibility)
|
||||||
|
'adsense-placementVisibilityHome' => ['group' => '_page_visibility', 'attribute' => 'show_on_home'],
|
||||||
|
'adsense-placementVisibilityPosts' => ['group' => '_page_visibility', 'attribute' => 'show_on_posts'],
|
||||||
|
'adsense-placementVisibilityPages' => ['group' => '_page_visibility', 'attribute' => 'show_on_pages'],
|
||||||
|
'adsense-placementVisibilityArchives' => ['group' => '_page_visibility', 'attribute' => 'show_on_archives'],
|
||||||
|
'adsense-placementVisibilitySearch' => ['group' => '_page_visibility', 'attribute' => 'show_on_search'],
|
||||||
|
|
||||||
|
// Exclusions (grupo especial _exclusions - Plan 99.11)
|
||||||
|
'adsense-placementExclusionsEnabled' => ['group' => '_exclusions', 'attribute' => 'exclusions_enabled'],
|
||||||
|
'adsense-placementExcludeCategoriesAdv' => ['group' => '_exclusions', 'attribute' => 'exclude_categories', 'type' => 'json_array'],
|
||||||
|
'adsense-placementExcludePostIdsAdv' => ['group' => '_exclusions', 'attribute' => 'exclude_post_ids', 'type' => 'json_array_int'],
|
||||||
|
'adsense-placementExcludeUrlPatterns' => ['group' => '_exclusions', 'attribute' => 'exclude_url_patterns', 'type' => 'json_array_lines'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ declare(strict_types=1);
|
|||||||
namespace ROITheme\Admin\AdsensePlacement\Infrastructure\Ui;
|
namespace ROITheme\Admin\AdsensePlacement\Infrastructure\Ui;
|
||||||
|
|
||||||
use ROITheme\Admin\Infrastructure\Ui\AdminDashboardRenderer;
|
use ROITheme\Admin\Infrastructure\Ui\AdminDashboardRenderer;
|
||||||
|
use ROITheme\Admin\Shared\Infrastructure\Ui\ExclusionFormPartial;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FormBuilder para AdSense Placement y Google Analytics
|
* FormBuilder para AdSense Placement y Google Analytics
|
||||||
@@ -96,6 +97,47 @@ final class AdsensePlacementFormBuilder
|
|||||||
$html .= '<small class="text-muted d-block" style="margin-top: -8px; margin-left: 40px;">No mostrar anuncios a usuarios con sesion iniciada en WordPress</small>';
|
$html .= '<small class="text-muted d-block" style="margin-top: -8px; margin-left: 40px;">No mostrar anuncios a usuarios con sesion iniciada en WordPress</small>';
|
||||||
$html .= '</div>';
|
$html .= '</div>';
|
||||||
|
|
||||||
|
// =============================================
|
||||||
|
// Visibilidad por tipo de pagina
|
||||||
|
// Grupo especial: _page_visibility (Plan 99.11)
|
||||||
|
// =============================================
|
||||||
|
$html .= '<hr class="my-3">';
|
||||||
|
$html .= '<p class="small fw-semibold mb-2">';
|
||||||
|
$html .= ' <i class="bi bi-layout-text-window me-1" style="color: #FF8600;"></i>';
|
||||||
|
$html .= ' Mostrar en tipos de pagina';
|
||||||
|
$html .= '</p>';
|
||||||
|
|
||||||
|
$showOnHome = $this->renderer->getFieldValue($cid, '_page_visibility', 'show_on_home', true);
|
||||||
|
$showOnPosts = $this->renderer->getFieldValue($cid, '_page_visibility', 'show_on_posts', true);
|
||||||
|
$showOnPages = $this->renderer->getFieldValue($cid, '_page_visibility', 'show_on_pages', true);
|
||||||
|
$showOnArchives = $this->renderer->getFieldValue($cid, '_page_visibility', 'show_on_archives', true);
|
||||||
|
$showOnSearch = $this->renderer->getFieldValue($cid, '_page_visibility', 'show_on_search', true);
|
||||||
|
|
||||||
|
$html .= '<div class="row g-2">';
|
||||||
|
$html .= ' <div class="col-md-4">';
|
||||||
|
$html .= $this->buildPageVisibilityCheckbox($cid . 'VisibilityHome', 'Home', 'bi-house', $showOnHome);
|
||||||
|
$html .= ' </div>';
|
||||||
|
$html .= ' <div class="col-md-4">';
|
||||||
|
$html .= $this->buildPageVisibilityCheckbox($cid . 'VisibilityPosts', 'Posts', 'bi-file-earmark-text', $showOnPosts);
|
||||||
|
$html .= ' </div>';
|
||||||
|
$html .= ' <div class="col-md-4">';
|
||||||
|
$html .= $this->buildPageVisibilityCheckbox($cid . 'VisibilityPages', 'Paginas', 'bi-file-earmark', $showOnPages);
|
||||||
|
$html .= ' </div>';
|
||||||
|
$html .= ' <div class="col-md-4">';
|
||||||
|
$html .= $this->buildPageVisibilityCheckbox($cid . 'VisibilityArchives', 'Archivos', 'bi-archive', $showOnArchives);
|
||||||
|
$html .= ' </div>';
|
||||||
|
$html .= ' <div class="col-md-4">';
|
||||||
|
$html .= $this->buildPageVisibilityCheckbox($cid . 'VisibilitySearch', 'Busqueda', 'bi-search', $showOnSearch);
|
||||||
|
$html .= ' </div>';
|
||||||
|
$html .= '</div>';
|
||||||
|
|
||||||
|
// =============================================
|
||||||
|
// Reglas de exclusion avanzadas
|
||||||
|
// Grupo especial: _exclusions (Plan 99.11)
|
||||||
|
// =============================================
|
||||||
|
$exclusionPartial = new ExclusionFormPartial($this->renderer);
|
||||||
|
$html .= $exclusionPartial->render($cid, $cid);
|
||||||
|
|
||||||
$html .= ' </div>';
|
$html .= ' </div>';
|
||||||
$html .= '</div>';
|
$html .= '</div>';
|
||||||
|
|
||||||
@@ -921,4 +963,23 @@ final class AdsensePlacementFormBuilder
|
|||||||
esc_attr($id), esc_html($label), esc_attr($id), $optionsHtml
|
esc_attr($id), esc_html($label), esc_attr($id), $optionsHtml
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function buildPageVisibilityCheckbox(string $id, string $label, string $icon, $value): string
|
||||||
|
{
|
||||||
|
$checked = checked($value, true, false);
|
||||||
|
|
||||||
|
return sprintf(
|
||||||
|
'<div class="form-check">
|
||||||
|
<input class="form-check-input" type="checkbox" id="%s" %s>
|
||||||
|
<label class="form-check-label small" for="%s">
|
||||||
|
<i class="bi %s me-1" style="color: #6c757d;"></i>%s
|
||||||
|
</label>
|
||||||
|
</div>',
|
||||||
|
esc_attr($id),
|
||||||
|
$checked,
|
||||||
|
esc_attr($id),
|
||||||
|
esc_attr($icon),
|
||||||
|
esc_html($label)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user