__( 'Newsletters', "alo-easymail" ), 'singular_name' => __( 'Newsletter', "alo-easymail" ), 'add_new' => __( 'Add New', "alo-easymail" ), 'add_new_item' => __( 'Add New Newsletter', "alo-easymail" ), 'edit_item' => __( 'Edit Newsletter', "alo-easymail" ), 'new_item' => __( 'New Newsletter', "alo-easymail" ) , 'view_item' => __( 'View Newsletter', "alo-easymail" ), 'search_items' => __( 'Search Newsletters', "alo-easymail" ), 'not_found' => __( 'No Newsletters found', "alo-easymail" ), 'not_found_in_trash' => __( 'No Newsletters found in Trash', "alo-easymail" ), 'parent_item_colon' => __( 'Parent Newsletter', "alo-easymail" ), 'menu_name' => __( 'Newsletters', "alo-easymail" ), 'parent' => __( 'Parent Newsletter', "alo-easymail" ), ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'exclude_from_search' => false, 'rewrite' => array('slug' => 'newsletters'), //'capability_type' => 'post', // TODO vedi sotto // @link http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types 'capability_type' => 'newsletter', 'capabilities' => array( 'publish_posts' => 'publish_newsletters', 'edit_posts' => 'edit_newsletters', 'edit_others_posts' => 'edit_others_newsletters', 'delete_posts' => 'delete_newsletters', 'delete_others_posts'=> 'delete_others_newsletters', 'read_private_posts'=> 'read_private_newsletters', // DO not assign the next 3 caps to roles: will be mapped by filter 'edit_post' => 'edit_newsletter', 'delete_post' => 'delete_newsletter', 'read_post' => 'read_newsletter', ), 'has_archive' => true, 'hierarchical' => false, 'menu_position' => false, 'menu_icon' => 'dashicons-email', 'can_export' => true, 'supports' => array( 'title' , 'editor', 'custom-fields', 'thumbnail' ), // 'show_in_rest' => true // @todo: set true when ready for Gutenberg; for now disabled for issues with metaboxes ); // If it doesn't allow newsletter publication online if ( get_option('alo_em_publish_newsletters') == "no" ) { $args['public'] = false; $args['publicly_queryable'] = false; $args['show_ui'] = true; $args['show_in_menu'] = true; $args['query_var'] = false; $args['exclude_from_search'] = true; // TODO read here: http://jandcgroup.com/2011/09/14/exclude-custom-post-types-from-wordpress-search-do-not-use-exclude_from_search/ } $args = apply_filters ( 'alo_easymail_register_newsletter_args', $args ); register_post_type( 'newsletter', $args ); } add_action('init', 'alo_em_register_newsletter_type'); /** * Filtering the map_meta_cap hook to know if user can do something * * @link http://justintadlock.com/archives/2010/07/10/meta-capabilities-for-custom-post-types */ function alo_em_map_meta_cap( $caps, $cap, $user_id, $args ) { // If editing, deleting, or reading an item, get the post and post type object. if ( 'edit_newsletter' == $cap || 'delete_newsletter' == $cap || 'read_newsletter' == $cap ) { $post = get_post( $args[0] ); $post_type = get_post_type_object( $post->post_type ); // Set an empty array for the caps. $caps = array(); } // If editing assign the required capability. if ( 'edit_newsletter' == $cap ) { if ( $user_id == $post->post_author ) $caps[] = $post_type->cap->edit_posts; else $caps[] = $post_type->cap->edit_others_posts; } // If deleting, assign the required capability. elseif ( 'delete_newsletter' == $cap ) { if ( $user_id == $post->post_author ) $caps[] = $post_type->cap->delete_posts; else $caps[] = $post_type->cap->delete_others_posts; } // If reading a private item, assign the required capability. elseif ( 'read_newsletter' == $cap ) { if ( 'private' != $post->post_status ) $caps[] = 'read'; elseif ( $user_id == $post->post_author ) $caps[] = 'read'; else $caps[] = $post_type->cap->read_private_posts; } // Return the capabilities required by the user. return $caps; } add_filter( 'map_meta_cap', 'alo_em_map_meta_cap', 10, 4 ); /** * Texts when a Newsletter is updated */ function alo_em_newsletter_updated_messages( $messages ) { global $post, $post_ID; if ( get_option('alo_em_publish_newsletters') == "no" ) { $view_url = ""; $preview_url = ""; } else { $view_url = sprintf( __(' View Newsletter', "alo-easymail" ), esc_url( get_permalink($post_ID) ) ); $preview_url = sprintf( __(' Preview Newsletter', "alo-easymail"), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ); } $messages['newsletter'] = array( 0 => '', // Unused. Messages start at index 1. 1 => __('Newsletter updated.', "alo-easymail" ). $view_url, 2 => __('Custom field updated.', "alo-easymail"), 3 => __('Custom field deleted.', "alo-easymail"), 4 => __('Newsletter updated.', "alo-easymail"), /* translators: %s: date and time of the revision */ 5 => isset($_GET['revision']) ? sprintf( __('Newsletter restored to revision from %s', "alo-easymail"), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => __('Newsletter published.', "alo-easymail") . $view_url, 7 => __('Newsletter saved.', "alo-easymail"), 8 => sprintf( __('Newsletter submitted. Preview Newsletter', "alo-easymail"), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 9 => sprintf( __('Newsletter scheduled for: %1$s.', "alo-easymail"), // translators: Publish box date format, see http://php.net/date date_i18n( __( 'j M Y @ G:i', "alo-easymail" ), strtotime( $post->post_date ) ) ). $preview_url, 10 => __('Newsletter draft updated.', "alo-easymail") . $preview_url , ); return $messages; } add_filter('post_updated_messages', 'alo_em_newsletter_updated_messages'); /** * Adds media upload in thickbox in Newsletter */ function alo_em_newsletter_add_media_upload_scripts() { if ($GLOBALS['post_type'] == 'newsletter') { add_thickbox(); wp_enqueue_script('media-upload'); } } add_action('admin_print_styles-post-new.php', 'alo_em_newsletter_add_media_upload_scripts'); add_action('admin_print_styles-post.php', 'alo_em_newsletter_add_media_upload_scripts'); /** * Adds an type column in table */ function alo_em_edit_table_columns ( $columns ) { unset ( $columns["date"] ); $columns["cb"] = ""; $columns["title"] = __( 'Title' ) ." / " . __( 'Subject', "alo-easymail"); $columns["easymail_recipients"] = __( 'Recipients', "alo-easymail" ); $columns["easymail_status"] = __( 'Newsletter status', "alo-easymail" ); $columns["date"] = __( 'Start', "alo-easymail" ); $columns["author"] = __( 'Author' ); return $columns; } add_filter ('manage_edit-newsletter_columns', 'alo_em_edit_table_columns'); /** * Fills the columns of Newsletter display table */ function alo_em_table_column_value ( $columns ) { global $post, $user_ID; //$count_recipients = 0; //alo_em_count_recipients_from_meta( $post->ID ); // todo fix $recipients = alo_em_get_recipients_from_meta( $post->ID ); $status = alo_em_get_newsletter_status($post->ID); if ( $columns == "easymail_recipients" ) { if ( get_post_meta( $post->ID, '_easymail_re_permission', true ) ) { echo '' . __("Re-permission campaign", "alo-easymail") ."
\n"; } if ( $status == '' && empty( $recipients['total'] ) && empty( $recipients['estimated_total'] ) ) { if ( alo_em_user_can_edit_newsletter( $post->ID ) ) echo ''; echo ' ' . __( 'No recipients selected yet', "alo-easymail").''; if ( alo_em_user_can_edit_newsletter( $post->ID ) ) echo ''; } else { if ( alo_em_user_can_edit_newsletter( $post->ID ) ) echo ""; echo __( 'Total recipients', "alo-easymail") .": "; echo alo_em_count_recipients_from_meta( $post->ID ); if ( alo_em_user_can_edit_newsletter( $post->ID ) ) { echo "
\n"; echo "
\n". alo_em_recipients_short_summary ( $recipients ) ."
\n"; } } } if ( $columns == "easymail_status" ) { if ( ! ( $status == '' && empty( $recipients['total'] ) && empty( $recipients['estimated_total'] ) ) ) { echo ''; echo "ID}\">\n"; alo_em_update_column_status ( $post->ID ); echo "\n"; } } } add_action ('manage_posts_custom_column', 'alo_em_table_column_value' ); /** * Update status column after closing recipients thickbox */ function alo_em_ajax_column_status () { $newsletter = (int)$_POST['post_id']; if ( $newsletter ) alo_em_update_column_status( $newsletter ); die(); } add_action('wp_ajax_alo_easymail_update_column_status', 'alo_em_ajax_column_status'); /** * Pause/Play Newsletter, then update status column after closing recipients thickbox */ function alo_em_ajax_pauseplay_column_status () { $newsletter = $_POST['post_id']; $button = $_POST['button']; // pause or play? if ( $newsletter && current_user_can( "publish_newsletters" ) ) { if ( $button == "pause" ) { alo_em_edit_newsletter_status ( $newsletter, 'paused' ); } else { alo_em_edit_newsletter_status ( $newsletter, 'sendable' ); } alo_em_update_column_status( $newsletter ); } die(); } add_action('wp_ajax_alo_easymail_pauseplay_column_status', 'alo_em_ajax_pauseplay_column_status'); /** * Print html of Status column of Newsletter in display table */ function alo_em_update_column_status ( $newsletter ) { global $user_ID; $recipients = alo_em_get_recipients_from_meta ( $newsletter ); if ( $recipients ) { // Post status $post_status = get_post_status( $newsletter ); //Newsletter status $status = alo_em_get_newsletter_status( $newsletter ); // Is it a Re-permission campaign? $is_re_permission = get_post_meta( $newsletter, '_easymail_re_permission', true ); $report_url = wp_nonce_url( ALO_EM_PLUGIN_URL . '/pages/alo-easymail-admin-report.php?', 'alo-easymail_report'); $goto_report = ""; $goto_report .= "\"\" ". __( 'Report', "alo-easymail") .""; if ( alo_em_is_newsletter_recipients_archived ( $newsletter ) ) $goto_report .= " (". __( 'archived', "alo-easymail") . ")"; switch ( $status ) { case "sent": echo "". __("Completed", "alo-easymail"). ": 100%
"; $end = get_post_meta ( $newsletter, "_easymail_completed", current_time( 'mysql', 0 ) ); if ( $end ) echo date_i18n( __( 'j M Y @ G:i', "alo-easymail" ), strtotime( $end ) ). "
"; if ( alo_em_user_can_edit_newsletter( $newsletter ) ) echo $goto_report; break; case "sendable": switch ( $post_status ) { case "publish": echo "".__("On sending queue", "alo-easymail"). "...
"; echo __("Progress", "alo-easymail"). ": ". alo_em_newsletter_recipients_percentuage_already_sent( $newsletter ) . "%
"; if ( alo_em_user_can_edit_newsletter( $newsletter ) && current_user_can( "publish_newsletters" ) ) { echo ' '. __( 'refresh', '; echo ""; echo ' '. __( 'pause', '; echo ""; } if ( alo_em_user_can_edit_newsletter( $newsletter ) && current_user_can( "publish_newsletters" )) echo " ". $goto_report; break; case "pending": echo "".__("Pending Review"). "
"; break; case "future": echo "".__("Scheduled"). "
"; if ( alo_em_user_can_edit_newsletter( $newsletter ) ) { echo ' '. __( 'refresh', '; } break; case "draft": echo "".__("Draft"). "
"; break; default: echo "".__("Pending"). "
"; break; } // $post_status break; case "paused": echo "".__("Paused", "alo-easymail"). "!
"; echo __("Progress", "alo-easymail"). ": ". alo_em_newsletter_recipients_percentuage_already_sent( $newsletter ) . "%
"; //if ( alo_em_count_newsletter_recipients_already_sent ( $newsletter ) > 0 ) echo " (".alo_em_count_newsletter_recipients_already_sent ( $newsletter ) ."/". alo_em_count_newsletter_recipients ( $newsletter ). ")
"; if ( alo_em_user_can_edit_newsletter( $newsletter ) ) { echo ""; echo ' '. __( 'continue', '; echo ""; } if ( alo_em_user_can_edit_newsletter( $newsletter ) ) echo " ". $goto_report; break; case false: default: switch ( $post_status ) { case "pending": case "draft": echo "".__("A newsletter cannot be sent if its status is draft or pending review"). "
"; break; default: if ( get_option('alo_em_js_rec_list') != "no_ajax_onsavepost" ) { // if required, no link to ajax //$rec_url = wp_nonce_url( ALO_EM_PLUGIN_URL . '/alo-easymail_recipients-list.php?', 'alo-easymail_recipients-list'); if ( alo_em_user_can_edit_newsletter( $newsletter ) && current_user_can( "publish_newsletters" ) ) { //echo ""; echo ""; echo "\"\" " . __( 'Required', "alo-easymail") .": " . __( 'Create list of recipients', "alo-easymail"); echo ""; } else { echo "".__('Ready to be sent by an administrator', "alo-easymail"). "
"; } } break; } // $post_status } } } /** * Add "views" button in edit newsletter table */ function alo_em_edit_table_views ( $views ) { $class = ( isset ( $_GET['easymail_status'] ) && $_GET['easymail_status'] == "sent" ) ? "current" : false; if ( alo_em_count_newsletters_by_status( 'sent' ) > 0 ) { // post_status=true: to avoid "All" view is the current $views[ "easymail_status" ] = "\t". __( 'Sent', "alo-easymail") . sprintf( " (%d)", alo_em_count_newsletters_by_status( 'sent' ) /*TODO*/ ) .""; } return $views; } add_filter( 'views_edit-newsletter', 'alo_em_edit_table_views' ); /** * Show required newsletters in edit newsletter table */ function alo_em_filter_newsletter_table ( $query ) { global $wp_version, $pagenow; if ( is_admin() && $pagenow == "edit.php" && isset( $_GET['post_type'] ) && $_GET['post_type'] == "newsletter" ) { if ( isset ( $_GET['easymail_status'] ) && $_GET['easymail_status'] == "sent" ) { // query meta: http://codex.wordpress.org/Function_Reference/WP_Query#Custom_Field_Parameters if ( version_compare ( $wp_version , '3.1', '>=' ) ) { $meta_1 = array( 'key' => '_easymail_status', 'value' => 'sent', 'compare' => '=' ); $query->set ('meta_query', array( $meta_1 ) ); } else { $query->set ('meta_key', '_easymail_status' ); $query->set ('meta_value', 'sent' ); $query->set ('meta_compare', '=' ); } } } return $query; } add_action('pre_get_posts', 'alo_em_filter_newsletter_table' ); /** * Boxes meta in Newsletter edit/new pages */ function alo_em_newsletter_add_custom_box() { add_meta_box( "alo_easymail_newsletter_recipients", __("Recipients", "alo-easymail"), "alo_em_meta_recipients", "newsletter", "side", "high" ); if ( get_option('alo_em_use_themes') == 'yes' || get_option('alo_em_use_themes') == '' ) { add_meta_box( "alo_easymail_newsletter_themes", __("Themes", "alo-easymail"), "alo_em_meta_themes", "newsletter", "normal", "high" ); } add_meta_box( "alo_easymail_newsletter_placeholders", __("Placeholders", "alo-easymail"), "alo_em_meta_placeholders", "newsletter", "normal", "high" ); if ( current_user_can('manage_newsletter_subscribers') ) { add_meta_box( "alo_easymail_newsletter_re_permission", __("Re-permission campaign", "alo-easymail"), "alo_em_meta_re_permission", "newsletter", "normal", "default" ); } } add_action('add_meta_boxes', 'alo_em_newsletter_add_custom_box', 8); /** * Box meta: Recipients */ function alo_em_meta_recipients ( $post ) { wp_nonce_field( ALO_EM_PLUGIN_DIR, "edit_newsletter" ); //print_r ( alo_em_get_recipients_from_meta($post->ID) ); print_r ( alo_em_get_all_languages() ); echo "

ID ) == 0 ) ? "class=\"easymail-txtwarning\"" : "" ) ." >"; echo "" .__("Selected recipients", "alo-easymail") .": ". alo_em_count_recipients_from_meta( $post->ID ) ."

"; if ( alo_em_get_newsletter_status ( $post->ID ) == "sent" || alo_em_is_newsletter_recipients_archived ( $post->ID ) ) { echo "

". __("This newsletter was already sent", "alo-easymail") .".

"; echo "
"; return; // exit } if ( alo_em_count_newsletter_recipients ( $post->ID ) > 0 ) { echo "

". __("The creation of the recipients list has already started", "alo-easymail") .".

"; echo "

"; echo "

"; echo "
"; } $recipients = alo_em_get_recipients_from_meta ( $post->ID ); ?>
". print_r ( $themes, true ). ""; // DEBUG echo '\n"; echo "". __("View") .""; ?> ID ); } /** * Save Post select in Placeholder Box meta in Newsletter */ function alo_em_save_newsletter_placeholders_easymail_post ( $post_id ) { if ( isset( $_POST['placeholder_easymail_post'] ) && is_numeric( $_POST['placeholder_easymail_post'] ) ) { update_post_meta ( $post_id, '_placeholder_easymail_post', $_POST['placeholder_easymail_post'] ); } else { update_post_meta ( $post_id, '_placeholder_easymail_post', 0 ); } } add_action('alo_easymail_save_newsletter_meta_extra', 'alo_em_save_newsletter_placeholders_easymail_post' ); /** * Box meta: Re-permission campaign */ function alo_em_meta_re_permission ( $post ) { wp_nonce_field( ALO_EM_PLUGIN_DIR, "edit_newsletter" ); $is_re_permission = get_post_meta( $post->ID, '_easymail_re_permission', true ); $checked = ( $is_re_permission ) ? ' checked="checked" ' : ''; if ( alo_em_get_newsletter_status ( $post->ID ) == "sent" || alo_em_is_newsletter_recipients_archived ( $post->ID ) ) { $disabled = 'disabled'; } else { $disabled = ''; } ?>

/>

.

:

__("This placeholder produces a link (html <a> tag) and has the following parameters", "alo-easymail"). ":". "". __("Sample:", "alo-easymail") . ": " . "". "[CONFIRMATION-LINK title=\"I agree\" style=\"font-weight: bold;color: #ffffff;background-color: #ff0000;\"]". "", '[CONFIRMATION-URL]' => __("The confirmation URL", "alo-easymail"), ); foreach ( $placeholders as $tag => $desc ) : ?>
[CONFIRMATION-LINK] / [CONFIRMATION-URL]' ) ?>
0 || alo_em_is_newsletter_recipients_archived ( $post_id ) ) { if ( isset( $_POST['easymail-reset-all-recipients'] ) ) { alo_em_delete_newsletter_recipients ( $post_id ); alo_em_delete_newsletter_status ( $post_id ); alo_em_delete_cache_recipients ( $post_id ); } else { return $post_id; // don't save, exit } } // Save Recipients $recipients = array (); if ( isset( $_POST['easymail-recipients-all-regusers'] ) ) { $recipients['registered'] = "1"; } else { if ( isset($_POST['check_role']) && is_array ($_POST['check_role']) ) { foreach ( $_POST['check_role'] as $role ) { $recipients['role'][] = $role; } } } if ( isset( $_POST['easymail-recipients-all-subscribers'] ) ) { $recipients['subscribers'] = "1"; } else { if ( isset($_POST['check_list']) && is_array ($_POST['check_list']) ) { foreach ( $_POST['check_list'] as $list ) { $recipients['list'][] = $list; } } } if ( isset($_POST['check_lang']) && is_array ($_POST['check_lang']) ) { foreach ( $_POST['check_lang'] as $lang ) { $recipients['lang'][] = $lang; } } // Save! delete_post_meta ( $post_id, "_easymail_recipients" ); add_post_meta ( $post_id, "_easymail_recipients", $recipients ); // If required, create list of recipient now, without ajax if ( get_option('alo_em_js_rec_list') == "no_ajax_onsavepost" && alo_em_count_recipients_from_meta( $post_id ) > 0 ) { alo_em_create_cache_recipients( $post_id ); alo_em_add_recipients_from_cache_to_db( $post_id, alo_em_count_recipients_from_meta( $post_id ), false ); } } add_action('save_post', 'alo_em_save_newsletter_meta'); /** * When a Newsletter is deleted: eg. delete recipients from db table */ function alo_em_newsletter_deleted ( $post_id ) { alo_em_delete_newsletter_recipients( $post_id ); } add_action( 'delete_post', 'alo_em_newsletter_deleted' ); /** * When click Preview btn, save the content */ function alo_em_save_newsletter_content_transient () { global $user_ID; check_ajax_referer( "alo-easymail" ); $newsletter_id = ( isset( $_POST['newsletter'] ) && is_numeric( $_POST['newsletter'] ) ) ? (int) $_POST['newsletter'] : false; $theme = ( isset( $_POST['theme'] ) && array_key_exists( $_POST['theme'], alo_easymail_get_all_themes() ) ) ? stripslashes(trim( $_POST['theme'] ) ) : ''; if ( $newsletter_id ) { $data = array( 'theme' => $theme ); set_transient( 'alo_em_content_preview_'.$newsletter_id, $data, 60*3 ); die ( '1' ); } die( '-1' ); } add_action('wp_ajax_alo_easymail_save_newsletter_content_transient', 'alo_em_save_newsletter_content_transient'); /** * When save newsletter, delete content in transient */ function alo_em_delete_newsletter_content_transient ( $post_id ) { delete_transient( 'alo_em_content_preview_'.$post_id ); } add_action('alo_easymail_save_newsletter_meta_extra', 'alo_em_delete_newsletter_content_transient' ); /** * Generation of List of recipients in modal */ function alo_em_recipient_list_modal() { global $post, $pagenow, $user_email; if ( $pagenow == "post.php" || ( isset( $_GET['post_type'] ) && $_GET['post_type'] == "newsletter" ) ) { ?>

.

.

.

: " /> " />

0 && $response['n_tot'] > 0 ) ? round ( $response['n_done'] * 100 / $response['n_tot'] ) : 0; } header( "Content-Type: application/json" ); die( json_encode ( $response ) ); } add_action('wp_ajax_alo_easymail_recipient_list_ajaxloop', 'alo_em_ajax_recipient_list_ajaxloop'); /* EOF */