Commit inicial - WordPress Análisis de Precios Unitarios

- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
root
2025-11-03 21:04:30 -06:00
commit a22573bf0b
24068 changed files with 4993111 additions and 0 deletions

View File

@@ -0,0 +1,150 @@
.advads-ad-positioning {
margin-bottom: -20px !important;
}
.advads-ad-positioning-position-groups-wrapper {
display: flex !important;
float: none !important;
}
.advads-ad-positioning-position-group {
display: flex;
flex-wrap: wrap;
flex-basis: 163px;
row-gap: 20px;
column-gap: 14px;
margin-left: 35px;
margin-right: 36px;
position: relative;
}
.advads-ad-positioning-position-group::after {
content: "";
display: block;
height: 100%;
width: 1px;
background-color: #c3c4c7;
position: absolute;
right: -35px;
top: 0;
}
.advads-ad-positioning-position-group:first-child {
margin-left: 0;
}
.advads-ad-positioning-position-group:last-child {
margin-right: 0;
}
.advads-ad-positioning-position-group:last-child::after {
display: none;
}
.advads-ad-positioning-position-group-heading, .advads-ad-positioning-position-group-description {
margin: 0;
flex-basis: 100%;
}
.advads-ad-positioning-position-group-heading {
font-size: 13px;
}
.advads-ad-positioning-position-wrapper {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
}
.advads-ad-positioning-position-wrapper.is-checked .advads-ad-positioning-position-icon path {
fill: #fff;
}
.advads-ad-positioning-position-wrapper.is-checked .advads-ad-positioning-position-icon .background {
fill: #0074A2;
}
.advads-ad-positioning-position-wrapper:hover .advads-ad-positioning-position-icon path, .advads-ad-positioning-position-wrapper:focus .advads-ad-positioning-position-icon path {
fill: #fff;
}
.advads-ad-positioning-position-wrapper:hover .advads-ad-positioning-position-icon .background, .advads-ad-positioning-position-wrapper:focus .advads-ad-positioning-position-icon .background {
fill: #0074A2;
}
.advads-ad-positioning-position-icon {
width: 45px;
height: 45px;
}
.advads-ad-positioning-position-icon svg {
width: 100%;
height: 100%;
}
#advads-ad-positioning-position-right_float ~ .advads-ad-positioning-position-icon, #advads-ad-positioning-position-right_nofloat ~ .advads-ad-positioning-position-icon {
transform: rotateZ(180deg);
}
.advads-ad-positioning-position-option {
position: absolute;
z-index: -1;
}
.advads-ad-positioning-spacing-wrapper {
display: inline-grid !important;
float: none !important;
grid-template-rows: auto 17px auto 17px auto;
grid-template-columns: auto 17px auto 17px auto;
grid-template-areas: ". . top . ." ". . icon_top . ." "left icon_left ad icon_right right" ". . icon_bottom . ." ". . bottom . legend";
}
label[for=advads-ad-positioning-spacing-top] {
grid-area: top;
}
label[for=advads-ad-positioning-spacing-right] {
grid-area: right;
}
label[for=advads-ad-positioning-spacing-bottom] {
grid-area: bottom;
}
label[for=advads-ad-positioning-spacing-left] {
grid-area: left;
}
.advads-ad-positioning-spacing-option {
width: 65px;
}
.advads-ad-positioning-spacing-option[type=number] {
padding-right: 2px;
}
.advads-ad-positioning-spacing-legend {
grid-area: legend;
align-self: end;
justify-self: end;
}
.advads-ad-positioning-spacing-direction {
justify-self: center;
align-self: center;
}
.advads-ad-positioning-spacing-direction svg path {
transform-origin: center;
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-top {
grid-area: icon_top;
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-top svg path {
transform: rotate(0deg);
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-right {
grid-area: icon_right;
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-right svg path {
transform: rotate(90deg);
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-bottom {
grid-area: icon_bottom;
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-bottom svg path {
transform: rotate(180deg);
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-left {
grid-area: icon_left;
}
.advads-ad-positioning-spacing-direction.advads-ad-positioning-spacing-left svg path {
transform: rotate(270deg);
}
.advads-ad-positioning-spacing-adcenter {
grid-area: ad;
background-color: var(--advads-ci-lightblue);
color: #fff;
border-radius: 4px;
text-align: center;
align-self: center;
line-height: 30px;
}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 30 30" overflow="visible" enable-background="new 0 0 30 30" xml:space="preserve">
<path class="background" fill="#F2FCFE" d="M0,27.001C0,28.656,1.344,30,3,30h24c1.656,0,3-1.344,3-2.999V3c0-1.657-1.344-3-3-3H3C1.344,0,0,1.343,0,3
V27.001z"/>
<path fill="#66ACC7" d="M25.501,5.25H4.5c-0.414,0-0.75-0.335-0.75-0.75S4.086,3.75,4.5,3.75h21.001c0.414,0,0.75,0.335,0.75,0.75
S25.915,5.25,25.501,5.25z"/>
<path fill="#66ACC7" d="M25.501,8.25H4.5c-0.414,0-0.75-0.335-0.75-0.75S4.086,6.75,4.5,6.75h21.001c0.414,0,0.75,0.335,0.75,0.75
S25.915,8.25,25.501,8.25z"/>
<path fill="#66ACC7" d="M25.5,26.25H4.499c-0.414,0-0.75-0.336-0.75-0.75c0-0.415,0.336-0.75,0.75-0.75H25.5
c0.414,0,0.75,0.335,0.75,0.75C26.25,25.914,25.914,26.25,25.5,26.25z"/>
<path fill="#66ACC7" d="M25.5,23.249H4.499c-0.414,0-0.75-0.336-0.75-0.751c0-0.414,0.336-0.75,0.75-0.75H25.5
c0.414,0,0.75,0.336,0.75,0.75C26.25,22.913,25.914,23.249,25.5,23.249z"/>
<path fill="#0074A2" d="M19.5,9.75h-9c-0.415,0-0.75,0.335-0.75,0.75v9c0,0.415,0.335,0.751,0.75,0.751h9
c0.415,0,0.75-0.336,0.75-0.751v-9C20.25,10.086,19.915,9.75,19.5,9.75z M15,18c-1.654,0-3-1.345-3-3s1.346-3,3-3
s3.001,1.346,3.001,3S16.654,18,15,18z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 30 30" overflow="visible" enable-background="new 0 0 30 30" xml:space="preserve">
<path class="background" fill="#F2FCFE" d="M0,27.001C0,28.656,1.344,30,3,30h24c1.656,0,3-1.344,3-2.999V3c0-1.657-1.344-3-3-3H3C1.344,0,0,1.343,0,3
V27.001z"/>
<path fill="#66ACC7" d="M25.501,5.25H4.5c-0.414,0-0.75-0.335-0.75-0.75S4.086,3.75,4.5,3.75h21.001c0.414,0,0.75,0.335,0.75,0.75
S25.915,5.25,25.501,5.25z"/>
<path fill="#66ACC7" d="M25.501,8.25H4.5c-0.414,0-0.75-0.335-0.75-0.75S4.086,6.75,4.5,6.75h21.001c0.414,0,0.75,0.335,0.75,0.75
S25.915,8.25,25.501,8.25z"/>
<path fill="#66ACC7" d="M25.5,26.25H4.499c-0.414,0-0.75-0.336-0.75-0.75c0-0.415,0.336-0.75,0.75-0.75H25.5
c0.414,0,0.75,0.335,0.75,0.75C26.25,25.914,25.914,26.25,25.5,26.25z"/>
<path fill="#66ACC7" d="M25.5,23.249H4.499c-0.414,0-0.75-0.336-0.75-0.751c0-0.414,0.336-0.75,0.75-0.75H25.5
c0.414,0,0.75,0.336,0.75,0.75C26.25,22.913,25.914,23.249,25.5,23.249z"/>
<path fill="#0074A2" d="M13.499,9.75h-9c-0.414,0-0.75,0.335-0.75,0.75v9c0,0.415,0.336,0.751,0.75,0.751h9
c0.415,0,0.751-0.336,0.751-0.751v-9C14.25,10.086,13.914,9.75,13.499,9.75z M11.249,17.25c0,0.268-0.144,0.516-0.375,0.65
c-0.116,0.067-0.246,0.1-0.375,0.1s-0.26-0.033-0.375-0.1l-3.897-2.25C5.994,15.516,5.851,15.269,5.851,15s0.144-0.516,0.376-0.649
l3.897-2.25c0.231-0.135,0.519-0.135,0.75,0c0.231,0.134,0.375,0.381,0.375,0.649V17.25z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 30 30" overflow="visible" enable-background="new 0 0 30 30" xml:space="preserve">
<path class="background" fill="#F2FCFE" d="M0,27c0,1.656,1.344,3,3,3h24c1.656,0,3-1.344,3-3V3c0-1.657-1.344-3-3-3H3C1.344,0,0,1.343,0,3V27z"/>
<path fill="#0074A2" d="M20.25,10.5h-7.205v-3c0-0.268-0.145-0.516-0.376-0.649c-0.231-0.135-0.519-0.135-0.75,0l-7.794,4.5
C3.894,11.484,3.75,11.732,3.75,12s0.144,0.516,0.375,0.65l7.794,4.499c0.116,0.067,0.246,0.102,0.375,0.102
c0.13,0,0.26-0.034,0.375-0.102c0.231-0.133,0.376-0.381,0.376-0.648v-3h7.205c1.655,0,3.001,1.346,3.001,3
c0,1.654-1.346,3.001-3.001,3.001h-5.706c-0.829,0-1.499,0.67-1.499,1.5c0,0.828,0.67,1.5,1.499,1.5h5.706c3.309,0,6-2.691,6-6.001
C26.25,13.192,23.559,10.5,20.25,10.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="30px" height="30px" viewBox="0 0 30 30" overflow="visible" enable-background="new 0 0 30 30" xml:space="preserve">
<path class="background" fill="#F2FCFE" d="M0,27.001C0,28.656,1.344,30,3,30h24c1.656,0,3-1.344,3-2.999v-24C30,1.343,28.656,0,27,0H3
C1.344,0,0,1.343,0,3V27.001z"/>
<path fill="#66ACC7" d="M25.501,5.25H4.5c-0.414,0-0.75-0.335-0.75-0.75S4.086,3.75,4.5,3.75h21.001c0.414,0,0.75,0.335,0.75,0.75
S25.915,5.25,25.501,5.25z"/>
<path fill="#66ACC7" d="M25.501,8.251H4.5c-0.414,0-0.75-0.335-0.75-0.75s0.336-0.75,0.75-0.75h21.001c0.414,0,0.75,0.335,0.75,0.75
S25.915,8.251,25.501,8.251z"/>
<path fill="#66ACC7" d="M25.501,11.25h-9c-0.415,0-0.751-0.335-0.751-0.75s0.336-0.75,0.751-0.75h9c0.414,0,0.75,0.335,0.75,0.75
S25.915,11.25,25.501,11.25z"/>
<path fill="#66ACC7" d="M25.501,14.25h-9c-0.415,0-0.751-0.335-0.751-0.75c0-0.415,0.336-0.75,0.751-0.75h9
c0.414,0,0.75,0.335,0.75,0.75C26.251,13.914,25.915,14.25,25.501,14.25z"/>
<path fill="#66ACC7" d="M25.501,17.25h-9c-0.415,0-0.751-0.335-0.751-0.75c0-0.414,0.336-0.75,0.751-0.75h9
c0.414,0,0.75,0.335,0.75,0.75C26.251,16.915,25.915,17.25,25.501,17.25z"/>
<path fill="#66ACC7" d="M25.501,20.252h-9c-0.415,0-0.751-0.336-0.751-0.751c0-0.414,0.336-0.75,0.751-0.75h9
c0.414,0,0.75,0.336,0.75,0.75C26.251,19.916,25.915,20.252,25.501,20.252z"/>
<path fill="#66ACC7" d="M25.5,26.25H4.499c-0.414,0-0.75-0.336-0.75-0.75c0-0.415,0.336-0.75,0.75-0.75H25.5
c0.414,0,0.75,0.335,0.75,0.75C26.25,25.914,25.914,26.25,25.5,26.25z"/>
<path fill="#66ACC7" d="M25.5,23.249H4.499c-0.414,0-0.75-0.336-0.75-0.751c0-0.414,0.336-0.75,0.75-0.75H25.5
c0.414,0,0.75,0.336,0.75,0.75C26.25,22.913,25.914,23.249,25.5,23.249z"/>
<path fill="#0074A2" d="M13.499,9.75h-9c-0.414,0-0.75,0.335-0.75,0.75v9c0,0.415,0.336,0.751,0.75,0.751h9
c0.415,0,0.751-0.336,0.751-0.751v-9C14.25,10.086,13.914,9.75,13.499,9.75z M11.249,17.25c0,0.268-0.144,0.516-0.375,0.65
c-0.116,0.067-0.246,0.1-0.375,0.1s-0.26-0.033-0.375-0.1l-3.897-2.25C5.994,15.516,5.851,15.269,5.851,15s0.144-0.516,0.376-0.649
l3.897-2.25c0.231-0.135,0.519-0.135,0.75,0c0.231,0.134,0.375,0.381,0.375,0.649V17.25z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="10px" height="9px" viewBox="0 0 10 9" overflow="visible" enable-background="new 0 0 10 9" xml:space="preserve">
<defs>
</defs>
<path fill="#0074A2" d="M0,7.75c0-0.216,0.056-0.433,0.171-0.626l3.748-6.497C4.14,0.239,4.553,0,4.999,0
c0.447,0,0.859,0.239,1.082,0.626l3.751,6.497c0.225,0.386,0.225,0.865,0,1.251C9.608,8.76,9.195,9,8.749,9H1.251
c-0.445,0-0.859-0.24-1.08-0.625C0.056,8.182,0,7.964,0,7.75z"/>
</svg>

After

Width:  |  Height:  |  Size: 682 B

View File

@@ -0,0 +1,20 @@
( () => {
const labels = document.getElementsByClassName( 'advads-ad-positioning-position-wrapper' ),
options = document.getElementsByClassName( 'advads-ad-positioning-position-option' ),
marginLeftInput = document.getElementById( 'advads-ad-positioning-spacing-left' ),
marginRightInput = document.getElementById( 'advads-ad-positioning-spacing-right' );
for ( const option of options ) {
option.addEventListener( 'change', event => {
for ( let label of labels ) {
label.classList.remove( 'is-checked' );
}
option.parentElement.classList.add( 'is-checked' );
const position = event.target.value.split( '_' );
marginLeftInput.readOnly = position[0] === 'center';
marginRightInput.readOnly = position[0] === 'center';
} );
}
} )();

View File

@@ -0,0 +1,215 @@
<?php // phpcs:ignoreFile
use AdvancedAds\Abstracts\Ad;
/**
* Class handling the ad positioning and migrating values from previous solutions.
*/
class Advanced_Ads_Ad_Positioning {
/**
* The instance of the current ad.
*
* @var Ad
*/
private $ad;
/**
* The structure of these output options.
*
* @var array
*/
private $positioning = [
'position' => 'none',
'clearfix' => false,
'margin' => [
'top' => 0,
'left' => 0,
'bottom' => 0,
'right' => 0,
],
];
/**
* Class constructor.
*
* @param Ad $ad The current ad object.
*/
public function __construct( Ad $ad ) {
$this->ad = $ad;
$this->migrate_values();
$this->filter_values();
}
/**
* Migrate option from a previous solution where floating was an additional setting.
*
* @return void
*/
private function migrate_values() {
$options = $this->get_options();
$this->positioning['margin'] = array_merge(
$this->positioning['margin'],
array_map( function($value) { return (int)$value; }, $options['margin'] )
);
$this->positioning['position'] = $options['position'];
// instead of having an empty value, set an explicit default.
if ( empty( $this->positioning['position'] ) ) {
$this->positioning['position'] = 'none';
$this->positioning['clearfix'] = false;
}
// left, center, right are the old values, if it's none of these we've already migrated.
if ( ! in_array( $this->positioning['position'], [ 'left', 'center', 'right' ], true ) ) {
// ensure we get an array with min two elements.
$position = explode( '_', $this->positioning['position'] . '_' );
// explicitly set clearfix option.
$this->positioning['clearfix'] = $position[0] !== 'center' && $position[1] === 'nofloat';
return;
}
if ( $this->positioning['position'] === 'center' ) {
$this->positioning['position'] = 'center_nofloat';
return;
}
$this->positioning['clearfix'] = ! empty( $options['clearfix'] );
$this->positioning['position'] .= $this->positioning['clearfix'] ? '_nofloat' : '_float';
}
/**
* Filter the option value for Ad.
* This ensures we don't have to update the whole positioning process but can change only the wp-admin side of things.
*
* @return void
*/
private function filter_values() {
foreach ( $this->positioning as $key => $value ) {
add_filter( "advanced-ads-ad-option-output.{$key}", function() use ( $value ) {
return $value;
} );
if ( is_array( $value ) ) {
foreach ( $value as $sub_key => $sub_value ) {
add_filter( "advanced-ads-ad-option-output.{$sub_key}", function() use ( $sub_value ) {
return $sub_value;
} );
}
}
}
}
/**
* Set up the positioning options with title, description and icon.
*
* @return array
*/
private function setup_positioning_options() {
return [
'default' => [
'title' => __( "Themes Default", 'advanced-ads' ),
'description' => __( 'The ad will behave as predefined by the theme.', 'advanced-ads' ),
'options' => [
'none' => [],
],
],
'float' => [
'title' => _x( 'Float', 'Layout options "Text Flow" heading', 'advanced-ads' ),
'description' => __( 'Text will wrap around the ad and its margin.', 'advanced-ads' ),
'options' => [
'left_float' => [],
'right_float' => [],
],
],
'block' => [
'title' => _x( 'Block', 'Layout options "Text Flow" heading', 'advanced-ads' ),
'description' => __( 'Text will continue after the ad and its margin.', 'advanced-ads' ),
'options' => [
'left_nofloat' => [
'img' => 'block-lr',
],
'center_nofloat' => [
'img' => 'block-cntr',
],
'right_nofloat' => [
'img' => 'block-lr',
],
],
],
];
}
/**
* Concatenate the templates and prepare inline styles and scripts.
*
* @return string
*/
public function return_admin_view() {
return $this->positioning_admin_view() . $this->spacing_admin_view();
}
/**
* Include the positioning view.
*
* @return string
*/
private function positioning_admin_view() {
$positioning = $this->positioning['position'];
$positioning_options = $this->setup_positioning_options();
ob_start();
include_once __DIR__ . '/../views/ad-positioning.php';
return ob_get_clean();
}
/**
* Include the spacing/margin view.
*
* @return string
*/
private function spacing_admin_view() {
$is_centered = explode( '_', $this->positioning['position'] )[0] === 'center';
$spacings = [
'top' => [
'label' => _x( 'Top', 'Ad positioning spacing label', 'advanced-ads' ),
],
'right' => [
'label' => _x( 'Right', 'Ad positioning spacing label', 'advanced-ads' ),
],
'bottom' => [
'label' => _x( 'Bottom', 'Ad positioning spacing label', 'advanced-ads' ),
],
'left' => [
'label' => _x( 'Left', 'Ad positioning spacing label', 'advanced-ads' ),
],
];
foreach ( $spacings as $direction => $item ) {
$spacings[ $direction ]['value'] = (int) $this->positioning['margin'][ $direction ];
}
ob_start();
include_once __DIR__ . '/../views/ad-spacing.php';
return ob_get_clean();
}
/**
* Get a well-formed array to work with.
*
* @return array
*/
private function get_options() {
$options = [
'position' => $this->ad->get_position(),
'clearfix' => $this->ad->get_clearfix(),
'margin' => $this->ad->get_margin(),
];
return wp_parse_args( $options, $this->positioning );
}
}

View File

@@ -0,0 +1,49 @@
<?php // phpcs:ignoreFile
/**
* Template for ad positioning.
*
* @var string $positioning how should the ad be positioned.
* @var array $spacing the spacing around the ad.
* @var array $positioning_options array of positioning options.
*/
?>
<div class="advads-ad-positioning-position advads-option-list">
<span class="label"><?php esc_html_e( 'Text Flow', 'advanced-ads' ); ?></span>
<div class="advads-ad-positioning-position-groups-wrapper">
<?php foreach ( $positioning_options as $group_name => $group ) : ?>
<div class="advads-ad-positioning-position-group">
<h3 class="advads-ad-positioning-position-group-heading"><?php echo esc_html( $group['title'] ); ?></h3>
<?php foreach ( $group['options'] as $option_name => $option ) : ?>
<?php $input_id = 'advads-ad-positioning-position-' . $option_name; ?>
<label
class="advads-ad-positioning-position-wrapper<?php echo( $option_name === $positioning ? ' is-checked' : '' ); ?>"
for="<?php echo esc_attr( $input_id ); ?>"
>
<input
type="radio"
class="advads-ad-positioning-position-option"
name="advanced_ad[output][position]"
id="<?php echo esc_attr( $input_id ); ?>"
value="<?php echo esc_attr( $option_name ); ?>"
<?php checked( $option_name, $positioning ); ?>
>
<div class="advads-ad-positioning-position-icon">
<?php
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- allow inline svg
echo preg_replace( '/\s+/', ' ', file_get_contents( sprintf( ADVADS_ABSPATH . 'modules/ad-positioning/assets/img/advads-bknd-ui-pos-%s.svg', esc_attr( isset( $option['img'] ) ? $option['img'] : $group_name ) ) ) );
?>
</div>
</label>
<?php endforeach; ?>
<p class="advads-ad-positioning-position-group-description">
<?php echo esc_html( $group['description'] ); ?>
</p>
</div>
<?php endforeach; ?>
</div>
</div>

View File

@@ -0,0 +1,49 @@
<?php
/**
* Settings for the spacing
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.x.x
*
* @var array $spacings array with values for top, right, bottom, left spacing pixel values.
* @var bool $is_centered Whether the "Block Center" position has been selected.
*/
?>
<hr class"advads-hide-in-wizard">
<div class="advads-ad-positioning-spacing advads-option-list">
<span class="label"><?php esc_html_e( 'Margin', 'advanced-ads' ); ?></span>
<div class="advads-ad-positioning-spacing-wrapper">
<?php foreach ( $spacings as $direction => $spacing ) : ?>
<?php $input_id = 'advads-ad-positioning-spacing-' . $direction; ?>
<label for="<?php echo esc_attr( $input_id ); ?>">
<span class="label screen-reader-text"><?php echo esc_html( $spacing['label'] ); ?></span>
<input
type="number"
step="1"
id="<?php echo esc_attr( $input_id ); ?>"
class="advads-ad-positioning-spacing-option"
name="advanced_ad[output][margin][<?php echo esc_attr( $direction ); ?>]"
value="<?php echo esc_attr( $spacing['value'] ); ?>"
<?php __checked_selected_helper( $is_centered && ( in_array( $direction, [ 'left', 'right' ], true ) ), true, true, 'readonly' ); ?>
>
</label>
<div class="advads-ad-positioning-spacing-direction <?php echo esc_attr( $input_id ); ?>" aria-hidden="true">
<?php
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- allow inline svg
echo preg_replace( '/\s+/', ' ', file_get_contents( ADVADS_ABSPATH . 'modules/ad-positioning/assets/img/advads-bknd-ui-pos-margin.svg' ) ); // phpcs:ignore
?>
</div>
<?php endforeach; ?>
<div class="advads-ad-positioning-spacing-adcenter" aria-hidden="true">
<?php esc_html_e( 'Ad', 'advanced-ads' ); ?>
</div>
<span class="advads-ad-positioning-spacing-legend"><?php echo esc_html_x( 'in px', 'Ad positioning spacing legend text', 'advanced-ads' ); ?></span>
</div>
</div>