Files
roi-theme/wp-content/plugins/thrive-ultimatum/thrive-dashboard/inc/smart-site/classes/content-set/class-post-rule.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

306 lines
7.0 KiB
PHP
Executable File

<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
namespace TVD\Content_Sets;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
* Class Post_Rule
*
* @package TVD\Content_Sets
* @project : thrive-dashboard
*/
class Post_Rule extends Rule {
/**
* @var string[]
*/
private $tax_fields
= array(
self::FIELD_CATEGORY => 'category',
self::FIELD_TAG => 'post_tag',
self::FIELD_AUTHOR => 'author',
);
/**
* Should be extended in child classes
*
* @param string $query_string
* @param bool|int $paged if non-false, it will return limited results
* @param int $per_page number of results per page. ignored if $paged = false
*
* @return array
*/
public function get_items( $query_string = '', $paged = false, $per_page = 15 ) {
/**
* Needed for the filter
*/
$this->query_string = $query_string;
$this->paged = $paged;
$this->per_page = $per_page;
return $this->should_search_terms() ? $this->search_terms() : $this->search_posts();
}
/**
* posts_where hook callback
* Searches particular post by title
*
* @param string $where
* @param \WP_Query $wp_query
*
* @return string
*/
public function title_filter( $where, $wp_query ) {
if ( $this->field === self::FIELD_TITLE ) {
global $wpdb;
$operation = $this->operator === self::OPERATOR_IS ? 'LIKE' : 'NOT LIKE';
$where .= ' AND ' . $wpdb->posts . '.post_title ' . $operation . ' \'%' . esc_sql( $wpdb->esc_like( $this->query_string ) ) . '%\'';
}
return $where;
}
/**
* terms_clauses hook callback
* Searches for a particular term by name
*
* @param $pieces
* @param $taxonomies
* @param $args
*
* @return array
*/
public function name_filter( $pieces, $taxonomies, $args ) {
if ( $this->should_search_terms() ) {
global $wpdb;
$operation = 'LIKE';
$pieces['where'] .= ' AND name ' . $operation . ' ' . ' \'%' . esc_sql( $wpdb->esc_like( $this->query_string ) ) . '%\' ';
}
return $pieces;
}
/**
* Prepares the item for front-end
*
* @param int $item
* @param bool $is_term
*
* @return array
*/
public function get_frontend_item( $item ) {
if ( $this->should_search_terms() ) {
return parent::get_frontend_item( $item );
}
$post = get_post( $item );
if ( empty( $post ) ) {
return array();
}
return array(
'id' => $post->ID,
'text' => $this->alter_frontend_title( $post->post_title, $post->post_status ),
);
}
/**
* Used to get all public content types needed for the content sets
*
* @return array
*/
public static function get_content_types() {
$ignored_types = apply_filters( 'thrive_ignored_post_types', array(
'attachment',
'tcb_lightbox',
'tcb_symbol',
'tva-acc-restriction',
) );
$all = get_post_types( array( 'public' => true ) );
$post_types = array();
foreach ( $all as $key => $post_type ) {
if ( in_array( $key, $ignored_types, true ) ) {
continue;
}
$post_types[ $key ] = tvd_get_post_type_label( $key );
}
/**
* Allow other functionality to be injected here
* Used to inject the Protected File post_type in the list so it can be protected by an apprentice product
*
* @param array $post_types
*/
return apply_filters( 'tvd_content_sets_get_content_types', $post_types );
}
/**
* Returns true if the UI needs to perform a terms search
*
* @return bool
*/
private function should_search_terms() {
return array_key_exists( $this->field, $this->tax_fields );
}
/**
* Returns the terms (category|post_tags) needed for the UI
* called from get_items method
*
* @return array
*/
private function search_terms() {
$response = array();
$taxonomy = $this->tax_fields[ $this->field ];
if ( $this->field === self::FIELD_AUTHOR ) {
$response = parent::search_users();
} else {
add_filter( 'terms_clauses', array( $this, 'name_filter' ), 10, 3 );
$query = new \WP_Term_Query();
$args = array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
);
if ( $this->paged !== false ) {
$args['number'] = $this->per_page;
$args['offset'] = ( $this->paged - 1 ) * $this->per_page;
}
$terms = $query->query( $args );
remove_filter( 'terms_clauses', array( $this, 'name_filter' ), 10 );
foreach ( $terms as $term ) {
$response[] = array(
'id' => $term->term_id,
'text' => $term->name,
);
}
}
return $response;
}
/**
* Returns the posts needed for the UI
* called from get_items method
*
* @return array
*/
private function search_posts() {
$response = array();
add_filter( 'posts_where', array( $this, 'title_filter' ), 10, 2 );
$query = new \WP_Query;
$args = array(
'post_type' => $this->content,
'post_status' => array( 'draft', 'publish' ),
'posts_per_page' => $this->paged !== false ? $this->per_page : - 1,
);
if ( $this->paged !== false ) {
$args['paged'] = $this->paged;
}
$posts = $query->query( $args );
remove_filter( 'posts_where', array( $this, 'title_filter' ), 10 );
foreach ( $posts as $post ) {
/**
* Allow other plugins to hook here and remove the post from the content set dropdown
*
* @param boolean return value
* @param \WP_Post $post
*/
if ( ! apply_filters( 'tvd_content_sets_allow_select_post', true, $post ) ) {
continue;
}
$response[] = array(
'id' => $post->ID,
'text' => $this->alter_frontend_title( $post->post_title, $post->post_status ),
);
}
return $response;
}
/**
* Test if a rule matches the given params
*
* @param int|string $value
* @param \WP_Post|\WP_Term $post_or_term
*
* @return bool
*/
public function match_value( $value, $post_or_term ) {
if ( $this->field === self::FIELD_PUBLISHED_DATE ) {
$post_published_date = get_the_date( 'Y-m-d', $post_or_term );
switch ( $this->operator ) {
case self::OPERATOR_LOWER_EQUAL:
return strtotime( $post_published_date ) <= strtotime( $this->value );
case self::OPERATOR_GRATER_EQUAL:
return strtotime( $post_published_date ) >= strtotime( $this->value );
case self::OPERATOR_WITHIN_LAST:
return strtotime( $post_published_date ) >= strtotime( '-' . $this->value );
default:
break;
}
return false;
}
if ( $this->field === self::FIELD_TAG ) {
$common = count( array_intersect( $this->value, wp_get_post_tags( $post_or_term->ID, array( 'fields' => 'ids' ) ) ) );
if ( $this->operator === self::OPERATOR_IS ) {
return $common > 0;
}
return $common === 0;
}
if ( $this->field === self::FIELD_CATEGORY ) {
$common = count( array_intersect( $this->value, wp_get_post_categories( $post_or_term->ID, array( 'fields' => 'ids' ) ) ) );
if ( $this->operator === self::OPERATOR_IS ) {
return $common > 0;
}
return $common === 0;
}
if ( $this->field === self::FIELD_AUTHOR ) {
return in_array( (int) $post_or_term->post_author, $this->value, true );
}
return parent::match_value( $value, $post_or_term );
}
}