Skip to:
Content
Pages
Categories
Search
Top
Bottom

Why are there no notifications?


  • Koka boka
    Participant

    @koka777

    I created a small plugin where users can subscribe to authors, but for some reason users are not notified when the author publishes a new post. Please help to solve this problem. I checked the logs, it shows that the notification was sent, but the notification itself is not there!

    <?php
    /*
    Plugin Name: Author Subscription and Notification
    Description: Allows users to subscribe to authors and receive notifications when authors publish new posts.
    Version: 1.3
    Author: test
    */
    
    // Hook to create the database table upon plugin activation
    register_activation_hook(__FILE__, 'create_subscriptions_table');
    
    function create_subscriptions_table() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'author_subscriptions';
        $charset_collate = $wpdb->get_charset_collate();
    
        $sql = "CREATE TABLE $table_name (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            user_id bigint(20) NOT NULL,
            author_id bigint(20) NOT NULL,
            PRIMARY KEY (id),
            UNIQUE KEY user_author (user_id, author_id)
        ) $charset_collate;";
    
        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);
    }
    
    // Hook to add subscription button in the post content
    add_filter('the_content', 'add_author_subscription_button_to_post');
    
    function add_author_subscription_button_to_post($content) {
        if (is_single() && is_user_logged_in()) {
            $author_id = get_the_author_meta('ID');
            $current_user_id = get_current_user_id();
            
            global $wpdb;
            $table_name = $wpdb->prefix . 'author_subscriptions';
    
            // Check if user is already subscribed
            $is_subscribed = $wpdb->get_var($wpdb->prepare(
                "SELECT COUNT(*) FROM $table_name WHERE user_id = %d AND author_id = %d",
                $current_user_id, $author_id
            ));
    
            $button_text = $is_subscribed ? 'Unsubscribe' : 'Subscribe';
            $button_html = '<button id="subscribe-author" class="subscribe-button" data-author-id="' . esc_attr($author_id) . '">' . esc_html($button_text) . '</button>';
            $button_html .= '<div id="subscription-message"></div>';
            
            $content .= $button_html;
        }
        return $content;
    }
    
    // Enqueue the JavaScript file and localize script
    add_action('wp_enqueue_scripts', 'enqueue_subscription_script');
    
    function enqueue_subscription_script() {
        if (is_single() && is_user_logged_in()) {
            wp_enqueue_script('subscription-script', plugin_dir_url(__FILE__) . 'subscription.js', array('jquery'), '1.0', true);
            wp_localize_script('subscription-script', 'subscriptionData', array(
                'ajax_url' => admin_url('admin-ajax.php'),
                'nonce'    => wp_create_nonce('subscription_nonce')
            ));
        }
    }
    
    // Handle the AJAX request for subscription
    add_action('wp_ajax_handle_author_subscription', 'handle_author_subscription');
    
    function handle_author_subscription() {
        check_ajax_referer('subscription_nonce', 'nonce');
    
        if (is_user_logged_in()) {
            global $wpdb;
            $table_name = $wpdb->prefix . 'author_subscriptions';
    
            $current_user_id = get_current_user_id();
            $author_id = intval($_POST['author_id']);
            $operation = sanitize_text_field($_POST['operation']);
            
            if ($operation === 'subscribe') {
                $wpdb->insert($table_name, array(
                    'user_id' => $current_user_id,
                    'author_id' => $author_id
                ));
                wp_send_json_success('Subscribed successfully.');
                error_log("User ID $current_user_id subscribed to author ID $author_id");
            } else if ($operation === 'unsubscribe') {
                $wpdb->delete($table_name, array(
                    'user_id' => $current_user_id,
                    'author_id' => $author_id
                ));
                wp_send_json_success('Unsubscribed successfully.');
                error_log("User ID $current_user_id unsubscribed from author ID $author_id");
            }
        }
        wp_send_json_error('Failed to update subscription.');
    }
    
    // Hook to send notifications when an author publishes a new post
    add_action('publish_post', 'notify_subscribers_on_new_post');
    
    function notify_subscribers_on_new_post($post_id) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'author_subscriptions';
    
        $post = get_post($post_id);
        $author_id = $post->post_author;
    
        error_log("New post published by author ID: " . $author_id);
    
        // Get subscribers
        $subscribers = $wpdb->get_results($wpdb->prepare(
            "SELECT user_id FROM $table_name WHERE author_id = %d",
            $author_id
        ));
    
        error_log("Subscribers found: " . count($subscribers));
    
        foreach ($subscribers as $subscriber) {
            // Send BuddyPress notification
            bp_notifications_add_notification(array(
                'user_id'           => $subscriber->user_id,
                'item_id'           => $post_id,
                'secondary_item_id' => $author_id,
                'component_name'    => 'buddypress',
                'component_action'  => 'new_post_by_subscribed_author',
                'date_notified'     => bp_core_current_time(),
                'is_new'            => true,
            ));
            error_log("Notification sent to user ID: " . $subscriber->user_id);
        }
    }
    
    // Custom notification format
    add_filter('bp_notifications_get_notifications_for_user', 'custom_bp_notification_format', 10, 5);
    
    function custom_bp_notification_format($content, $item_id, $secondary_item_id, $action, $component_name) {
        if ($component_name === 'buddypress' && $action === 'new_post_by_subscribed_author') {
            $author_name = get_the_author_meta('display_name', $secondary_item_id);
            $post_title = get_the_title($item_id);
            $post_url = get_permalink($item_id);
            
            $content = sprintf(__('New post by %s: <a href="%s">%s</a>', 'text-domain'), $author_name, $post_url, $post_title);
        }
        
        return $content;
    }
    ?>
    [23-May-2024 09:42:15 UTC] a:0:{}
    [23-May-2024 09:42:40 UTC] New post published by author ID: 1
    [23-May-2024 09:42:40 UTC] Subscribers found: 2
    [23-May-2024 09:42:40 UTC] Notification sent to user ID: 1
    [23-May-2024 09:42:40 UTC] Notification sent to user ID: 27
    [23-May-2024 09:42:43 UTC] a:0:{}
  • You must be logged in to reply to this topic.
Skip to toolbar