Files
roi-theme/wp-content/plugins/advanced-ads-pro/modules/gamipress/admin.class.php
root a22573bf0b 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>
2025-11-03 21:04:30 -06:00

180 lines
5.7 KiB
PHP
Executable File

<?php // phpcs:ignoreFile
/**
* Manage backend-facing logic for GamiPress integration
*/
class Advanced_Ads_Pro_Module_GamiPress_Admin {
/**
* Array of GamiPress visitor conditions.
*
* @var array
*/
private $conditions;
/**
* constructor.
*/
public function __construct() {
add_filter( 'advanced-ads-visitor-conditions', [ $this, 'visitor_conditions' ] );
$this->conditions = [
'gamipress_points' => [
'label' => __( 'GamiPress Points', 'advanced-ads-pro' ),
'description' => __( 'Display ads based on GamiPress user points.', 'advanced-ads-pro' ),
'metabox' => [ $this, 'points_metabox' ],
'check' => [ 'Advanced_Ads_Pro_Module_GamiPress', 'check_points_visitor_condition' ],
],
'gamipress_rank' => [
'label' => __( 'GamiPress Rank', 'advanced-ads-pro' ),
'description' => __( 'Display ads based on GamiPress user ranks.', 'advanced-ads-pro' ),
'metabox' => [ $this, 'achievement_rank_metabox' ],
'check' => [ 'Advanced_Ads_Pro_Module_GamiPress', 'check_rank_visitor_condition' ],
],
'gamipress_achievement' => [
'label' => __( 'GamiPress Achievement', 'advanced-ads-pro' ),
'description' => __( 'Display ads based on GamiPress user achievements.', 'advanced-ads-pro' ),
'metabox' => [ $this, 'achievement_rank_metabox' ],
'check' => [ 'Advanced_Ads_Pro_Module_GamiPress', 'check_achievement_visitor_condition' ],
],
];
}
/**
* Add visitor condition for GamiPress fields
*
* @param array $conditions array of registered visitor conditions.
*
* @return array
*/
public function visitor_conditions( $conditions ) {
return array_merge( $conditions, $this->conditions );
}
/**
* Render visitor conditions for achievements and ranks.
*
* @param array $options condition options.
* @param int $index index of the option.
* @param string $form_name name of the form.
*/
public function achievement_rank_metabox( $options, $index, $form_name ) {
$type = $options['type'];
$condition = $this->conditions[ $type ];
$name = Advanced_Ads_Pro_Module_Advanced_Visitor_Conditions::get_form_name_with_index( $form_name, $index );
$operator = isset( $options['operator'] ) ? $options['operator'] : 'is';
$selected_value = isset( $options['value'] ) ? $options['value'] : 0;
$values = $this->get_possible_values( $this->get_possible_types( $options['type'] ) );
if ( $type === 'gamipress_achievement' ) {
include __DIR__ . '/views/visitor-condition-achievement.php';
} else {
$values = $this->order_ranks_by_priority( $values );
include __DIR__ . '/views/visitor-condition-rank.php';
}
}
/**
* Render visitor conditions for points.
*
* @param array $options condition options.
* @param int $index index of the option.
* @param string $form_name name of the form.
*/
public function points_metabox( $options, $index, $form_name ) {
$type = $options['type'];
$condition = $this->conditions[ $type ];
$name = Advanced_Ads_Pro_Module_Advanced_Visitor_Conditions::get_form_name_with_index( $form_name, $index );
$operator = isset( $options['operator'] ) ? $options['operator'] : 'is';
$point_ids = $this->get_posts( 'points-type' );
$points = array_combine( $point_ids, array_map( static function( $post_id ) {
return get_post_meta( $post_id, '_gamipress_plural_name', true );
}, $point_ids ) );
$selected_points_type = isset( $options['points'] ) ? $options['points'] : 0;
$value = isset( $options['value'] ) ? $options['value'] : 0;
include __DIR__ . '/views/visitor-condition-points.php';
}
/**
* Get an array of achievements/rank for each achievement/rank type.
*
* @param int[] $types Post ids for type post types.
*
* @return array
*/
private function get_possible_values( $types ) {
return array_filter( array_combine(
// get the type name as optgroup title
array_map( static function( $post_id ) {
return get_the_title( $post_id );
}, $types ),
// get the actual values as $post_id => name
array_map( function( $post_id ) {
$children = $this->get_posts( get_post_field( 'post_name', $post_id ) );
return array_combine( $children, array_map( static function( $post_id ) {
return get_the_title( $post_id );
}, $children ) );
}, $types )
) );
}
/**
* Get array of post ids for $post_type.
*
* @param string $post_type The post type to search for.
*
* @return int[]
*/
private function get_posts( $post_type ) {
return ( new WP_Query( [
'post_type' => $post_type,
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
] ) )->posts;
}
/**
* Get an array of post ids for achievement/rank types.
*
* @param string $type Post type name.
*
* @return int[]
*/
private function get_possible_types( $type ) {
if ( $type === 'gamipress_achievement' ) {
return $this->get_posts( 'achievement-type' );
}
if ( $type === 'gamipress_rank' ) {
return $this->get_posts( 'rank-type' );
}
return [];
}
/**
* As ranks have priorities, we want to sort them based on it.
*
* @param array $ranks Array of ranks in form [int $post_id => string $post_title].
*
* @return array
*/
private function order_ranks_by_priority( array $ranks ) {
foreach ( $ranks as &$sub_ranks ) {
uksort( $sub_ranks, static function( $a, $b ) {
$a_priority = gamipress_get_rank_priority( $a );
$b_priority = gamipress_get_rank_priority( $b );
if ( $a_priority === $b_priority ) {
return 0;
}
return ( $a_priority < $b_priority ) ? -1 : 1;
} );
}
return $ranks;
}
}