/* PRX_ANNOUNCEMENT_AUDIENCE_V1 * Audience targeting for portal announcements. */ function prx_portal_announcement_audience_metabox() { add_meta_box( 'prx_announcement_audience', 'Announcement Audience', 'prx_portal_announcement_audience_metabox_html', 'prx_announcement', 'side', 'high' ); } add_action('add_meta_boxes_prx_announcement', 'prx_portal_announcement_audience_metabox'); function prx_portal_announcement_audience_metabox_html($post) { $audience = (string) get_post_meta($post->ID, '_prx_announcement_audience', true); if (!in_array($audience, ['all', 'hrt', 'peachscripts', 'partner_rewards'], true)) { $audience = 'all'; } wp_nonce_field('prx_save_announcement_audience', 'prx_announcement_audience_nonce'); $choices = [ 'all' => 'All active accounts', 'hrt' => 'HRT accounts only', 'peachscripts' => 'PeachScripts accounts only', 'partner_rewards' => 'Partner Rewards accounts only', ]; echo '

Choose which active pharmacy accounts can see this announcement.

'; foreach ($choices as $value => $label) { echo ''; } } function prx_portal_save_announcement_audience($post_id) { if ( !isset($_POST['prx_announcement_audience_nonce']) || !wp_verify_nonce( sanitize_text_field(wp_unslash($_POST['prx_announcement_audience_nonce'])), 'prx_save_announcement_audience' ) ) { return; } if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (!current_user_can('edit_post', $post_id)) return; $audience = isset($_POST['prx_announcement_audience']) ? sanitize_key(wp_unslash($_POST['prx_announcement_audience'])) : 'all'; if (!in_array($audience, ['all', 'hrt', 'peachscripts', 'partner_rewards'], true)) { $audience = 'all'; } update_post_meta($post_id, '_prx_announcement_audience', $audience); } add_action('save_post_prx_announcement', 'prx_portal_save_announcement_audience', 20); function prx_portal_allowed_announcement_audiences() { $allowed = ['all']; if ( function_exists('prx_portal_current_pharmacy_has_hrt') && prx_portal_current_pharmacy_has_hrt() ) { $allowed[] = 'hrt'; } if ( function_exists('prx_portal_current_pharmacy_has_peachscripts') && prx_portal_current_pharmacy_has_peachscripts() ) { $allowed[] = 'peachscripts'; } if ( function_exists('prx_portal_current_pharmacy_is_partner_rewards_member') && prx_portal_current_pharmacy_is_partner_rewards_member() ) { $allowed[] = 'partner_rewards'; } return array_values(array_unique($allowed)); } function prx_portal_filter_announcement_queries_by_audience($query) { if (is_admin()) return; $post_type = $query->get('post_type'); $is_announcement_query = $post_type === 'prx_announcement' || (is_array($post_type) && in_array('prx_announcement', $post_type, true)); if (!$is_announcement_query) return; $audience_clause = [ 'relation' => 'OR', [ 'key' => '_prx_announcement_audience', 'compare' => 'NOT EXISTS', ], [ 'key' => '_prx_announcement_audience', 'value' => prx_portal_allowed_announcement_audiences(), 'compare' => 'IN', ], ]; $existing = $query->get('meta_query'); if (empty($existing)) { $query->set('meta_query', [$audience_clause]); return; } $query->set('meta_query', [ 'relation' => 'AND', $existing, $audience_clause, ]); } add_action('pre_get_posts', 'prx_portal_filter_announcement_queries_by_audience', 99); function prx_portal_announcement_audience_column($columns) { $columns['prx_audience'] = 'Audience'; return $columns; } add_filter('manage_prx_announcement_posts_columns', 'prx_portal_announcement_audience_column'); function prx_portal_announcement_audience_column_value($column, $post_id) { if ($column !== 'prx_audience') return; $labels = [ 'all' => 'All active accounts', 'hrt' => 'HRT only', 'peachscripts' => 'PeachScripts only', 'partner_rewards' => 'Partner Rewards only', ]; $audience = (string) get_post_meta($post_id, '_prx_announcement_audience', true); echo esc_html($labels[$audience] ?? $labels['all']); } add_action('manage_prx_announcement_posts_custom_column', 'prx_portal_announcement_audience_column_value', 10, 2);