• File: Database.php
  • Full Path: /home/matthif/www/wp-content/plugins/google-analytics-for-wordpress/includes/admin/site-notes/Database.php
  • Date Modified: 01/24/2025 1:57 PM
  • File size: 11.07 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

/**
 * This file contains the class to interact with database.
 *
 * @since 1.0.0
 *
 * @package MonsterInsights
 * @package MonsterInsights_Site_Notes
 */

/**
 * Class containing CRUD operations for site notes in the custom post type.
 *
 * @since 1.0.0
 */
class MonsterInsights_Site_Notes_DB_Base
{

    private function 
create_post_type()
    {
        
$args = array(
            
'public'             => false,
            
'publicly_queryable' => false,
            
'show_ui'            => false,
            
'show_in_menu'       => false,
            
'query_var'          => true,
            
'capability_type'    => 'post',
            
'has_archive'        => false,
            
'supports'           => array('title''author''custom-fields')
        );

        
register_post_type('monsterinsights_note'$args);
    }

    private function 
create_taxonomy()
    {
        
$args = array(
            
'hierarchical' => false,
            
'show_ui'      => false,
            
'query_var'    => true,
            
'public'       => false,
        );

        
register_taxonomy('monsterinsights_note_category', array('monsterinsights_note'), $args);
    }

    public function 
insert_default_categories()
    {
        if (
get_option('monsterinsights_sitenotes_installed')) {
            return;
        }

        
$categories = array(
            
__('Website Updates''google-analytics-for-wordpress'),
            
__('Blog Post''google-analytics-for-wordpress'),
            
__('Promotion''google-analytics-for-wordpress'),
        );

        foreach (
$categories as $category) {
            
$this->create_category(
                array(
                    
'name' => $category,
                )
            );
        }

        
update_option('monsterinsights_sitenotes_installed'time());
    }

    public function 
install()
    {
        
$this->create_post_type();
        
$this->create_taxonomy();
    }

    private function 
get_category_name($id)
    {
        
$term get_term($id'monsterinsights_note_category');
        if (
is_wp_error($term)) {
            return 
false;
        }

        return 
$term->name;
    }

    
/**
     * Add new Site Note.
     *
     * @since 1.0.0
     *
     * @param array $data  Data to store.
     *
     * @return int|WP_Error
     */
    
public function create($data)
    {
        if (empty(
$data['note'])) {
            return new 
WP_Error(400__('Your Site Note Cannot be Empty''google-analytics-for-wordpress'));
        }

        
$note_post = array(
            
'ID' => isset($data['id']) ? $data['id'] : null,
            
'post_title'    => sanitize_text_field($data['note']),
            
'post_status'   => 'publish',
            
'post_author'   => isset( $data['author_id'] ) ? intval$data['author_id'] ) : get_current_user_id(),
            
'post_date'     => !empty($data['date']) ? $data['date'] : current_datetime()->format('Y-m-d'),
            
'post_type'     => 'monsterinsights_note',
        );
        
$post_id wp_insert_post($note_posttruefalse);

        if (
is_wp_error($post_id)) {
            return 
$post_id;
        }

        
// Attach the note to the category.
        
if (!empty($data['category'])) {
            if (
$category_name $this->get_category_name($data['category'])) {
                
wp_set_object_terms($post_id$data['category'], 'monsterinsights_note_category');
                
update_post_meta($post_id'_category'$category_name);
            }
        } else {
            
wp_set_object_terms($post_id, array(), 'monsterinsights_note_category');
            
update_post_meta($post_id'_category''');
        }

        if (!empty(
$data['medias'])) {
            
update_post_meta($post_id'medias'$data['medias']);
        }

        if (isset(
$data['important'])) {
            
update_post_meta($post_id'important'$data['important']);
        }

        return 
$post_id;
    }

    
/**
     * Add new Site Note's category.
     *
     * @since 1.0.0
     *
     * @param array $data  Data to store.
     *
     * @return int|WP_Error
     */
    
public function create_category($data)
    {
        if (isset(
$data['id'])) {
            
$created_term wp_update_term($data['id'], 'monsterinsights_note_category', array('name' => $data['name']));
        } else {
            
$created_term wp_insert_term($data['name'], 'monsterinsights_note_category');
        }

        if (
is_wp_error($created_term)) {
            return 
$created_term;
        }

        if (!empty(
$data['background_color'])) {
            
update_term_meta($created_term['term_id'], 'background_color'$data['background_color']);
        }

        return 
$created_term['term_id'];
    }

    
/**
     * Get site note with ID
     *
     * @since 1.0.0
     *
     * @param int $post_id Single entry.
     *
     * @return array|WP_Error
     */
    
public function get($post_id)
    {
        
$post get_post($post_id);

        if (!
$post) {
            return new 
WP_Error(400__('Note not found''google-analytics-for-wordpress'));
        }

        
$categories wp_get_object_terms($post->ID'monsterinsights_note_category');
        
$post_title get_the_title($post);
        
$note = array(
            
'id'  => $post->ID,
            
'note_title' => wp_strip_all_tags(html_entity_decode(htmlspecialchars_decode($post_title), ENT_COMPAT'UTF-8')),
            
'note_date' => get_the_date'Y-m-d'$post),
            
'note_date_ymd' => get_the_date'Y-m-d'$post ),
            
'status' => get_post_status($post),
            
'important' => (int) get_post_meta($post->ID'important'true),
            
'medias' => array(),
            
'category' => array(
                
'id' => 0,
            ),
        );

        if (
            
monsterinsights_is_pro_version()
            && 
$medias get_post_meta$post->ID'medias'true )
        ) {
            if ( ! empty( 
$medias ) ) {
                foreach (
$medias as $media_id) {
                    
$attachment_url wp_get_attachment_url($media_id);
                    if (!
$attachment_url) {
                        continue;
                    }

                    
$attachment_filename basenameget_attached_file$media_id ) );

                    
$note['medias'][ $media_id ] = [
                        
'url'  => $attachment_url,
                        
'name' => $attachment_filename
                    
];
                }
            }
        }

        
$note['medias'] = (object) $note['medias'];

        if (
$post->post_author) {
            
$user get_userdata($post->post_author);

            if (
$user) {
                
$note['author'] = array(
                    
'id'   => $user->ID,
                    
'name' => $user->display_name,
                );
            }
        }

        if (
$categories) {
            
$note['category'] = array(
                
'id'   => $categories[0]->term_id,
                
'name' => html_entity_decode$categories[0]->name ),
            );

            if (
monsterinsights_is_pro_version()) {
                
$background_color get_term_meta($categories[0]->term_id'background_color'true);
                
$note['category']['background_color'] = !empty($background_color) ? $background_color '#E9AF00';
            }
        }

        return 
$note;
    }

    
/**
     * Get rows from the database.
     *
     * @since 1.0.0
     *
     * @param array $args  Optional args.
     * @param bool  $count Flag to return count instead of results.
     *
     * @return array|int
     */
    
public function get_items($args = array(), $count false)
    {
        
$query_args = array(
            
'post_type'      => 'monsterinsights_note',
            
'posts_per_page' => $args['per_page'],
            
'paged'          => $args['page'],
            
'fields'         => 'ids',
            
'orderby'        => $args['orderby'],
            
'order'          => $args['order'],
            
'post_status'    => (isset($args['filter']) && !empty($args['filter']['status']) && 'all' !== $args['filter']['status']) ? $args['filter']['status'] : ['publish'],
        );

        if (isset(
$args['search'])) {
            
$query_args['s'] = $args['search'];
        }

        
$all_notes_query_args $query_args;
        
$all_notes_query_args['post_status'] = ['publish'];

        if (isset(
$args['filter'])) {
            if (isset(
$args['filter']['important']) && !is_null($args['filter']['important'])) {
                
$query_args['meta_key'] = 'important';
                
$query_args['meta_value'] = $args['filter']['important'];
            }
            if (isset(
$args['filter']['category']) && !is_null($args['filter']['category'])) {
                
$args['category'] = $args['filter']['category'];
            }
        }

        if (isset(
$args['filter']) && isset($args['filter']['date_range']) && !is_null($args['filter']['date_range'])) {
            
$query_args['date_query'] = array(
                
'after' => $args['filter']['date_range']['start'],
                
'before' => $args['filter']['date_range']['end'],
                
'inclusive' => true,
            );
            
$all_notes_query_args['date_query'] = array(
                
'after' => $args['filter']['date_range']['start'],
                
'before' => $args['filter']['date_range']['end'],
                
'inclusive' => true,
            );
        }

        if (!empty(
$args['category'])) {
            
$query_args['tax_query'] = array(
                array(
                    
'taxonomy' => 'monsterinsights_note_category',
                    
'field'    => 'term_id',
                    
'terms'    => $args['category'],
                ),
            );
        }

        if (
'category' === $query_args['orderby']) {
            
$query_args['meta_key'] = '_category';
            
$query_args['orderby'] = 'meta_value';
        }
        
// handle last30days

        
if (isset($query_args['date_query']) && !is_null($query_args['date_query'])) {
            if (
$query_args['date_query']['after'] == '' && $query_args['date_query']['before'] == '') {
                
$query_args['date_query']['before'] = wp_date('Y-m-d'strtotime('-1 day'));
                
$query_args['date_query']['after'] = wp_date('Y-m-d'strtotime('-30 days'));
                
$all_notes_query_args['date_query']['before'] = wp_date('Y-m-d'strtotime('-1 day'));
                
$all_notes_query_args['date_query']['after'] = wp_date('Y-m-d'strtotime('-30 days'));
            }
        }

        
$items = array();
        
$query = new WP_Query($query_args);
        
$all_notes_query = new WP_Query($all_notes_query_args);
        
$important_count 0;
        if (!
$query->have_posts()) {
            return array(
                
'items' => $items,
                
'pagination' => array(
                    
'total_published'    => $all_notes_query->post_count,
                    
'total_important'    => $important_count,
                    
'all_published'    => 0,
                    
'total'    => 0,
                    
'pages'    => 0,
                    
'page'     => $args['page'],
                    
'per_page' => $args['per_page'],
                ),
            );
        }

        foreach (
$query->posts as $post_id) {
            
$post $this->get($post_id);
            
$is_important get_post_meta($post_id'important'true);
            if(
$is_important){
                
$important_count++;
            }
            
$items[] = $post;
        }

        return array(
            
'items' => $items,
            
'pagination' => array(
                
'total_published'    => $all_notes_query->post_count,
                
'total_important'    => $important_count,
                
'total'    => $query->found_posts,
                
'pages'    => $query->max_num_pages,
                
'page'     => $args['page'],
                
'per_page' => $args['per_page'],
            ),
        );
    }

    public function 
get_categories($args = array(), $count false)
    {
        
$query_args = array(
            
'taxonomy' => 'monsterinsights_note_category',
            
'hide_empty' => false,
        );

        if (
$count) {
            return 
wp_count_terms($query_args);
        }

        
$query_args['offset'] = ($args['page'] - 1) * $args['per_page'];
        
$query_args['fields'] = 'id=>name';
        
$query_args['order'] = $args['order'];
        
$query_args['orderby'] = $args['orderby'];

        
$items get_terms($query_args);
        if (!
$items) {
            return 
false;
        }

        
$categories = array();

        foreach (
$items as $term_id => $term_name) {
            
$background_color get_term_meta($term_id'background_color'true);

            
$categories[] = array(
                
'id' => $term_id,
                
'name' => html_entity_decode$term_name ),
                
'background_color' => !empty($background_color) ? $background_color '#E9AF00',
            );
        }

        return 
$categories;
    }

    
/**
     * Delete note by ID.
     *
     * @since 1.0.0
     *
     * @param int $note_id Note ID.
     *
     * @return WP_Post|false|null
     */
    
public function trash_note($note_id 0)
    {
        if ( ! 
current_user_can'monsterinsights_save_settings' ) ) {
            return;
        }

        return 
wp_trash_post($note_id);
    }

    public function 
restore_note($note_id 0)
    {
        if ( ! 
current_user_can'monsterinsights_save_settings' ) ) {
            return;
        }
        return 
wp_untrash_post($note_id);
    }

    public function 
delete_note($note_id 0)
    {
        if ( ! 
current_user_can'monsterinsights_save_settings' ) ) {
            return;
        }
        return 
wp_delete_post($note_idtrue);
    }

    public function 
delete_category($id 0)
    {
        if ( ! 
current_user_can'monsterinsights_save_settings' ) ) {
            return;
        }
        return 
wp_delete_term($id'monsterinsights_note_category');
    }
}