Ticket #6592: 6592-posttype.01.patch
| File 6592-posttype.01.patch, 21.7 KB (added by , 10 years ago) |
|---|
-
src/bp-core/bp-core-admin.php
diff --git a/src/bp-core/bp-core-admin.php b/src/bp-core/bp-core-admin.php index 25cc48b..e0601a0 100644
a b class BP_Admin { 295 295 'bp_core_admin_tools' 296 296 ); 297 297 298 // Fudge the highlighted subnav item when on a BuddyPress admin page.299 298 foreach( $hooks as $hook ) { 300 299 add_action( "admin_head-$hook", 'bp_core_modify_admin_menu_highlight' ); 301 300 } … … class BP_Admin { 767 766 <a href="https://github.com/ichord/At.js">At.js</a>, 768 767 <a href="https://bbpress.org">bbPress</a>, 769 768 <a href="https://github.com/ichord/Caret.js">Caret.js</a>, 769 <a href="http://tedgoas.github.io/Cerberus/">Cerberus</a>, 770 770 <a href="https://github.com/carhartl/jquery-cookie">jquery.cookie</a>, 771 771 <a href="https://www.mediawiki.org/wiki/MediaWiki">MediaWiki</a>, 772 772 <a href="https://wordpress.org">WordPress</a>. … … class BP_Admin { 876 876 } 877 877 878 878 /** 879 * Add Emails menu item to custom menus array. 880 * 881 * Several BuddyPress components have top-level menu items in the Dashboard, 882 * which all appear together in the middle of the Dashboard menu. This function 883 * adds the Emails screen to the array of these menu items. 884 * 885 * @since 2.4.0 886 * 887 * @param array $custom_menus The list of top-level BP menu items. 888 * @return array $custom_menus List of top-level BP menu items, with Emails added. 889 */ 890 public function emails_admin_menu_order( $custom_menus = array() ) { 891 array_push( $custom_menus, 'edit.php?post_type=' . bp_get_email_post_type() ); 892 return $custom_menus; 893 } 894 895 /** 879 896 * Register styles commonly used by BuddyPress wp-admin screens. 880 897 * 881 898 * @since 2.5.0 -
src/bp-core/bp-core-filters.php
diff --git a/src/bp-core/bp-core-filters.php b/src/bp-core/bp-core-filters.php index 0d4b342..c9f8d9f 100644
a b function _bp_core_inject_bp_widget_css_class( $params ) { 1038 1038 return $params; 1039 1039 } 1040 1040 add_filter( 'dynamic_sidebar_params', '_bp_core_inject_bp_widget_css_class' ); 1041 1042 /** 1043 * Find and render the template for Email posts (the Customizer and admin previews). 1044 * 1045 * Misuses the `template_include` filter which expects a string, but as we need to replace 1046 * the `{{{content}}}` token with the post's content, we use object buffering to load the 1047 * template, replace the token, and render it. 1048 * 1049 * The function returns an empty string to prevent WordPress rendering another template. 1050 * 1051 * @since 2.5.0 1052 * 1053 * @param string $template Path to template (probably single.php). 1054 * @return string 1055 */ 1056 function bp_core_render_email_template( $template ) { 1057 if ( get_post_type() !== bp_get_email_post_type() || ! is_single() ) { 1058 return $template; 1059 } 1060 1061 /** 1062 * Filter template used to display Email posts. 1063 * 1064 * @since 2.5.0 1065 * 1066 * @param string $template Path to current template (probably single.php). 1067 */ 1068 $email_template = apply_filters( 'bp_core_render_email_template', 1069 bp_locate_template( bp_email_get_template( get_queried_object() ), false ), 1070 $template 1071 ); 1072 1073 if ( ! $email_template ) { 1074 return $template; 1075 } 1076 1077 ob_start(); 1078 include( $email_template ); 1079 $template = ob_get_contents(); 1080 ob_end_clean(); 1081 1082 echo str_replace( '{{{content}}}', nl2br( get_post()->post_content ), $template ); 1083 1084 /* 1085 * Link colours are applied directly in the email template before sending, so we 1086 * need to add an extra style here to set the colour for the Customizer or preview. 1087 */ 1088 $settings = bp_email_get_appearance_settings(); 1089 printf( 1090 '<style>a { color: %s; }</style>', 1091 esc_attr( $settings['highlight_color'] ) 1092 ); 1093 1094 return ''; 1095 } 1096 add_action( 'bp_template_include', 'bp_core_render_email_template', 12 ); -
src/bp-core/bp-core-functions.php
diff --git a/src/bp-core/bp-core-functions.php b/src/bp-core/bp-core-functions.php index 69a914e..489c31c 100644
a b function bp_upload_dir() { 2591 2591 2592 2592 return $bp->upload_dir; 2593 2593 } 2594 2595 2596 /** Post Types *****************************************************************/ 2597 2598 /** 2599 * Output the name of the email post type. 2600 * 2601 * @since 2.5.0 2602 */ 2603 function bp_email_post_type() { 2604 echo bp_get_email_post_type(); 2605 } 2606 /** 2607 * Returns the name of the email post type. 2608 * 2609 * @since 2.5.0 2610 * 2611 * @return string The name of the email post type. 2612 */ 2613 function bp_get_email_post_type() { 2614 2615 /** 2616 * Filters the name of the email post type. 2617 * 2618 * @since 2.5.0 2619 * 2620 * @param string $post_type Email post type name. 2621 */ 2622 return apply_filters( 'bp_get_email_post_type', buddypress()->email_post_type ); 2623 } 2624 2625 /** 2626 * Return labels used by the email post type. 2627 * 2628 * @since 2.5.0 2629 * 2630 * @return array 2631 */ 2632 function bp_get_email_post_type_labels() { 2633 2634 /** 2635 * Filters email post type labels. 2636 * 2637 * @since 2.5.0 2638 * 2639 * @param string[] $labels Associative array (name => label). 2640 */ 2641 return apply_filters( 'bp_get_email_post_type_labels', array( 2642 'add_new' => _x( 'Add New', 'email post type label', 'buddypress' ), 2643 'add_new_item' => _x( 'Add a New Email', 'email post type label', 'buddypress' ), 2644 'all_items' => _x( 'All Emails', 'email post type label', 'buddypress' ), 2645 'edit_item' => _x( 'Edit Email', 'email post type label', 'buddypress' ), 2646 'filter_items_list' => _x( 'Filter email list', 'email post type label', 'buddypress' ), 2647 'items_list' => _x( 'Email list', 'email post type label', 'buddypress' ), 2648 'items_list_navigation' => _x( 'Email list navigation', 'email post type label', 'buddypress' ), 2649 'name' => _x( 'Emails', 'email post type name', 'buddypress' ), 2650 'new_item' => _x( 'New Email', 'email post type label', 'buddypress' ), 2651 'not_found' => _x( 'No emails found', 'email post type label', 'buddypress' ), 2652 'not_found_in_trash' => _x( 'No emails found in Trash', 'email post type label', 'buddypress' ), 2653 'search_items' => _x( 'Search Emails', 'email post type label', 'buddypress' ), 2654 'singular_name' => _x( 'Email', 'email post type singular name', 'buddypress' ), 2655 'uploaded_to_this_item' => _x( 'Uploaded to this email', 'email post type label', 'buddypress' ), 2656 'view_item' => _x( 'View Email', 'email post type label', 'buddypress' ), 2657 ) ); 2658 } 2659 2660 /** 2661 * Return array of features that the email post type supports. 2662 * 2663 * @since 2.5.0 2664 * 2665 * @return array 2666 */ 2667 function bp_get_email_post_type_supports() { 2668 2669 /** 2670 * Filters the features that the email post type supports. 2671 * 2672 * @since 2.5.0 2673 * 2674 * @param string[] $features Supported features. 2675 */ 2676 return apply_filters( 'bp_get_email_post_type_supports', array( 2677 'editor', 2678 'excerpt', 2679 'revisions', 2680 'title', 2681 ) ); 2682 } 2683 2684 2685 /** Taxonomies *****************************************************************/ 2686 2687 /** 2688 * Output the name of the email type taxonomy. 2689 * 2690 * @since 2.5.0 2691 */ 2692 function bp_email_tax_type() { 2693 echo bp_get_email_tax_type(); 2694 } 2695 /** 2696 * Return the name of the email type taxonomy. 2697 * 2698 * @since 2.5.0 2699 * 2700 * @return string The unique email taxonomy type ID. 2701 */ 2702 function bp_get_email_tax_type() { 2703 2704 /** 2705 * Filters the name of the email type taxonomy. 2706 * 2707 * @since 2.5.0 2708 * 2709 * @param string $taxonomy Email type taxonomy name. 2710 */ 2711 return apply_filters( 'bp_get_email_tax_type', buddypress()->email_taxonomy_type ); 2712 } 2713 2714 /** 2715 * Return labels used by the email type taxonomy. 2716 * 2717 * @since 2.5.0 2718 * 2719 * @return string[] 2720 */ 2721 function bp_get_email_tax_type_labels() { 2722 2723 /** 2724 * Filters email type taxonomy labels. 2725 * 2726 * @since 2.5.0 2727 * 2728 * @param string[] $labels Associative array (name => label). 2729 */ 2730 return apply_filters( 'bp_get_email_tax_type_labels', array( 2731 'add_new_item' => _x( 'New Email Type', 'email type taxonomy label', 'buddypress' ), 2732 'all_items' => _x( 'All Email Types', 'email type taxonomy label', 'buddypress' ), 2733 'edit_item' => _x( 'Edit Email Types', 'email type taxonomy label', 'buddypress' ), 2734 'items_list' => _x( 'Email list', 'email type taxonomy label', 'buddypress' ), 2735 'items_list_navigation' => _x( 'Email list navigation', 'email type taxonomy label', 'buddypress' ), 2736 'menu_name' => _x( 'Types', 'email type taxonomy label', 'buddypress' ), 2737 'name' => _x( 'Email Types', 'email type taxonomy name', 'buddypress' ), 2738 'new_item_name' => _x( 'New Email Type Name', 'email type taxonomy label', 'buddypress' ), 2739 'not_found' => _x( 'No email types found.', 'email type taxonomy label', 'buddypress' ), 2740 'no_terms' => _x( 'No email types', 'email type taxonomy label', 'buddypress' ), 2741 'popular_items' => _x( 'Popular Email Types', 'email type taxonomy label', 'buddypress' ), 2742 'search_items' => _x( 'Search Emails', 'email type taxonomy label', 'buddypress' ), 2743 'singular_name' => _x( 'Email', 'email type taxonomy singular name', 'buddypress' ), 2744 'update_item' => _x( 'Update Email Type', 'email type taxonomy label', 'buddypress' ), 2745 'view_item' => _x( 'View Email Type', 'email type taxonomy label', 'buddypress' ), 2746 ) ); 2747 } 2748 2749 /** 2750 * Get the paths to possible templates for the specified email object. 2751 * 2752 * @since 2.5.0 2753 * 2754 * @param WP_Post $object Post to get email template for. 2755 * @return string[] 2756 */ 2757 function bp_email_get_template( WP_Post $object ) { 2758 $single = "single-{$object->post_type}"; 2759 2760 /** 2761 * Filter the possible template paths for the specified email object. 2762 * 2763 * @since 2.5.0 2764 * 2765 * @param string[] $templates 2766 */ 2767 return apply_filters( 'bp_email_get_template', array( 2768 "{$single}-{$object->post_name}.php", 2769 "{$single}.php", 2770 "assets/emails/{$single}.php", 2771 ), $object ); 2772 } -
src/bp-core/bp-core-loader.php
diff --git a/src/bp-core/bp-core-loader.php b/src/bp-core/bp-core-loader.php index 80cd4f6..1f1cb9a 100644
a b class BP_Core extends BP_Component { 285 285 286 286 parent::setup_cache_groups(); 287 287 } 288 289 /** 290 * Set up post types. 291 * 292 * @since BuddyPress (2.4.0) 293 */ 294 public function register_post_types() { 295 296 // Emails 297 register_post_type( 298 bp_get_email_post_type(), 299 apply_filters( 'bp_register_email_post_type', array( 300 //'capability_type' => array( 'bpemail', 'bpemails' ), TODO 301 'description' => _x( 'BuddyPress emails', 'email post type description', 'buddypress' ), 302 'labels' => bp_get_email_post_type_labels(), 303 'menu_icon' => 'dashicons-email', 304 'public' => false, 305 'publicly_queryable' => bp_current_user_can( 'bp_moderate' ), 306 'query_var' => false, 307 'rewrite' => false, 308 'show_in_admin_bar' => false, 309 'show_ui' => bp_current_user_can( 'bp_moderate' ), // TODO 310 'supports' => bp_get_email_post_type_supports(), 311 ) ) 312 ); 313 314 parent::register_post_types(); 315 } 288 316 } 289 317 290 318 /** -
src/bp-core/bp-core-taxonomy.php
diff --git a/src/bp-core/bp-core-taxonomy.php b/src/bp-core/bp-core-taxonomy.php index 7a9c4e6..0cbbc4f 100644
a b function bp_register_default_taxonomies() { 24 24 register_taxonomy( 'bp_member_type', 'user', array( 25 25 'public' => false, 26 26 ) ); 27 28 // Email type. 29 register_taxonomy( 30 bp_get_email_tax_type(), 31 bp_get_email_post_type(), 32 apply_filters( 'bp_register_email_tax_type', array( 33 'description' => _x( 'BuddyPress email types', 'email type taxonomy description', 'buddypress' ), 34 'labels' => bp_get_email_tax_type_labels(), 35 'public' => false, 36 'query_var' => false, 37 'rewrite' => false, 38 'show_admin_column' => true, 39 'show_tagcloud' => false, 40 'show_ui' => bp_current_user_can( 'bp_moderate' ), // TODO 41 ) ) 42 ); 27 43 } 28 44 add_action( 'bp_register_taxonomies', 'bp_register_default_taxonomies' ); 29 45 -
src/bp-core/bp-core-update.php
diff --git a/src/bp-core/bp-core-update.php b/src/bp-core/bp-core-update.php index a85c41e..3251fc4 100644
a b function bp_version_updater() { 213 213 bp_core_install( $default_components ); 214 214 bp_update_option( 'bp-active-components', $default_components ); 215 215 bp_core_add_page_mappings( $default_components, 'delete' ); 216 bp_core_install_emails(); 216 217 217 218 // Upgrades 218 219 } else { … … function bp_version_updater() { 260 261 if ( $raw_db_version < 9615 ) { 261 262 bp_update_to_2_3(); 262 263 } 264 265 // 2.5.0 266 if ( $raw_db_version < 10440 ) { 267 bp_update_to_2_5(); 268 } 263 269 } 264 270 265 271 /** All done! *************************************************************/ … … function bp_update_to_2_3() { 484 490 } 485 491 486 492 /** 493 * 2.5.0 update routine. 494 * 495 * - Add emails. 496 * 497 * @since 2.5.0 498 */ 499 function bp_update_to_2_5() { 500 bp_core_install_emails(); 501 } 502 503 /** 487 504 * Updates the component field for new_members type. 488 505 * 489 506 * @since 2.2.0 -
src/bp-loader.php
diff --git a/src/bp-loader.php b/src/bp-loader.php index 77d5408..7ee55b1 100644
a b class BuddyPress { 328 328 /** Versions **********************************************************/ 329 329 330 330 $this->version = '2.5.0-alpha'; 331 $this->db_version = 10 071;331 $this->db_version = 10440; 332 332 333 333 /** Loading ***********************************************************/ 334 334 … … class BuddyPress { 422 422 423 423 $this->current_user = new stdClass(); 424 424 $this->displayed_user = new stdClass(); 425 426 /** Post types and taxonomies *****************************************/ 427 $this->email_post_type = apply_filters( 'bp_email_post_type', 'bp-email' ); 428 $this->email_taxonomy_type = apply_filters( 'bp_email_tax_type', 'bp-email-type' ); 425 429 } 426 430 427 431 /** -
new file src/bp-templates/bp-legacy/buddypress/assets/emails/single-bp-email.php
diff --git a/src/bp-templates/bp-legacy/buddypress/assets/emails/single-bp-email.php b/src/bp-templates/bp-legacy/buddypress/assets/emails/single-bp-email.php new file mode 100644 index 0000000..3674f24
- + 1 <?php 2 /** 3 * BuddyPress email template. 4 * 5 * Magic numbers: 6 * 1.618 = golden mean. 7 * 1.35 = default body_text_size multipler. Gives default heading of 20px. 8 * @since 2.5.0 9 * 10 * @package BuddyPress 11 * @subpackage Core 12 */ 13 14 /* 15 Based on the Cerberus "Fluid" template by Ted Goas (http://tedgoas.github.io/Cerberus/). 16 License for the original template: 17 18 19 The MIT License (MIT) 20 21 Copyright (c) 2013 Ted Goas 22 23 Permission is hereby granted, free of charge, to any person obtaining a copy of 24 this software and associated documentation files (the "Software"), to deal in 25 the Software without restriction, including without limitation the rights to 26 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 27 the Software, and to permit persons to whom the Software is furnished to do so, 28 subject to the following conditions: 29 30 The above copyright notice and this permission notice shall be included in all 31 copies or substantial portions of the Software. 32 33 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 34 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 35 FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 36 COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 37 IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 38 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 39 */ 40 41 // Exit if accessed directly. 42 defined( 'ABSPATH' ) || exit; 43 44 $settings = bp_email_get_appearance_settings(); 45 46 ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 47 <html xmlns="http://www.w3.org/1999/xhtml"> 48 <head> 49 <meta charset="<?php echo esc_attr( get_bloginfo( 'charset' ) ); ?>"> 50 <meta name="viewport" content="width=device-width"> <!-- Forcing initial-scale shouldn't be necessary --> 51 <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- Use the latest (edge) version of IE rendering engine --> 52 <title></title> <!-- The title tag shows in email notifications, like Android 4.4. --> 53 54 <!-- CSS Reset --> 55 <style type="text/css"> 56 /* What it does: Remove spaces around the email design added by some email clients. */ 57 /* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */ 58 html, 59 body { 60 Margin: 0 !important; 61 padding: 0 !important; 62 height: 100% !important; 63 width: 100% !important; 64 } 65 66 /* What it does: Stops email clients resizing small text. */ 67 * { 68 -ms-text-size-adjust: 100%; 69 -webkit-text-size-adjust: 100%; 70 } 71 72 /* What it does: Forces Outlook.com to display emails full width. */ 73 .ExternalClass { 74 width: 100%; 75 } 76 77 /* What is does: Centers email on Android 4.4 */ 78 div[style*="margin: 16px 0"] { 79 margin: 0 !important; 80 } 81 82 /* What it does: Stops Outlook from adding extra spacing to tables. */ 83 table, 84 td { 85 mso-table-lspace: 0pt !important; 86 mso-table-rspace: 0pt !important; 87 } 88 89 /* What it does: Fixes webkit padding issue. Fix for Yahoo mail table alignment bug. Applies table-layout to the first 2 tables then removes for anything nested deeper. */ 90 table { 91 border-spacing: 0 !important; 92 border-collapse: collapse !important; 93 table-layout: fixed !important; 94 Margin: 0 auto !important; 95 } 96 table table table { 97 table-layout: auto; 98 } 99 100 /* What it does: Uses a better rendering method when resizing images in IE. */ 101 img { 102 -ms-interpolation-mode:bicubic; 103 } 104 105 /* What it does: Overrides styles added when Yahoo's auto-senses a link. */ 106 .yshortcuts a { 107 border-bottom: none !important; 108 } 109 110 /* What it does: A work-around for iOS meddling in triggered links. */ 111 a[x-apple-data-detectors] { 112 color: inherit !important; 113 text-decoration: underline !important; 114 } 115 </style> 116 117 </head> 118 <body class="email_bg" width="100%" height="100%" bgcolor="<?php echo esc_attr( $settings['email_bg'] ); ?>" style="Margin: 0;"> 119 <table cellpadding="0" cellspacing="0" border="0" height="100%" width="100%" bgcolor="<?php echo esc_attr( $settings['email_bg'] ); ?>" style="border-collapse:collapse;" class="email_bg"><tr><td valign="top"> 120 <center style="width: 100%;"> 121 122 <!-- Visually Hidden Preheader Text : BEGIN --> 123 <div style="display: none; font-size: 1px; line-height: 1px; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden; mso-hide: all; font-family: sans-serif;"> 124 (Optional) This text will appear in the inbox preview, but not the email body. 125 </div> 126 <!-- Visually Hidden Preheader Text : END --> 127 128 <div style="max-width: 600px;"> 129 <!--[if (gte mso 9)|(IE)]> 130 <table cellspacing="0" cellpadding="0" border="0" width="600" align="center"> 131 <tr> 132 <td> 133 <![endif]--> 134 135 <!-- Email Header : BEGIN --> 136 <table cellspacing="0" cellpadding="0" border="0" align="center" width="100%" style="max-width: 600px; border-top: 7px solid <?php echo esc_attr( $settings['highlight_color'] ); ?>" class="header_bg"> 137 <tr> 138 <td style="text-align: center; padding: 15px 0; font-family: sans-serif; mso-height-rule: exactly; font-weight: bold; color: <?php echo esc_attr( $settings['header_text_color'] ); ?>; font-size: <?php echo esc_attr( $settings['header_text_size'] . 'px' ); ?>" class="header_text_color header_text_size"> 139 <?php echo bp_get_option( 'blogname' ); ?> 140 </td> 141 </tr> 142 </table> 143 <!-- Email Header : END --> 144 145 <!-- Email Body : BEGIN --> 146 <table cellspacing="0" cellpadding="0" border="0" align="center" bgcolor="<?php echo esc_attr( $settings['body_bg'] ); ?>" width="100%" style="max-width: 600px; border-radius: 5px;" class="body_bg"> 147 148 <!-- 1 Column Text : BEGIN --> 149 <tr> 150 <td> 151 <table cellspacing="0" cellpadding="0" border="0" width="100%"> 152 <tr> 153 <td style="padding: 20px; font-family: sans-serif; mso-height-rule: exactly; line-height: <?php echo esc_attr( floor( $settings['body_text_size'] * 1.618 ) . 'px' ) ?>; color: <?php echo esc_attr( $settings['body_text_color'] ); ?>; font-size: <?php echo esc_attr( $settings['body_text_size'] . 'px' ); ?>" class="body_text_color body_text_size"> 154 <span style="font-weight: bold; font-size: <?php echo esc_attr( floor( $settings['body_text_size'] * 1.35 ) . 'px' ); ?>" class="welcome">Hi Paul Gibbs,</span> 155 <hr color="<?php echo esc_attr( $settings['email_bg'] ); ?>"><br> 156 {{{content}}} 157 </td> 158 </tr> 159 </table> 160 </td> 161 </tr> 162 <!-- 1 Column Text : BEGIN --> 163 164 </table> 165 <!-- Email Body : END --> 166 167 <!-- Email Footer : BEGIN --> 168 <br> 169 <table cellspacing="0" cellpadding="0" border="0" align="left" width="100%" style="max-width: 600px; border-radius: 5px;" bgcolor="<?php echo esc_attr( $settings['footer_bg'] ); ?>" class="footer_bg"> 170 <tr> 171 <td style="padding: 20px; width: 100%; font-size: <?php echo esc_attr( $settings['footer_text_size'] . 'px' ); ?>; font-family: sans-serif; mso-height-rule: exactly; line-height: <?php echo esc_attr( floor( $settings['footer_text_size'] * 1.618 ) . 'px' ) ?>; text-align: left; color: <?php echo esc_attr( $settings['footer_text_color'] ); ?>;" class="footer_text_color footer_text_size"> 172 <span class="footer_text"><?php echo nl2br( $settings['footer_text'] ); ?></span> 173 <br><br> 174 <a href="{{{unsubscribe}}}" style="text-decoration: underline;"><?php _ex( 'unsubscribe', 'email', 'buddypress' ); ?></a> 175 </td> 176 </tr> 177 </table> 178 <!-- Email Footer : END --> 179 180 <!--[if (gte mso 9)|(IE)]> 181 </td> 182 </tr> 183 </table> 184 <![endif]--> 185 </div> 186 </center> 187 </td></tr></table> 188 <?php if ( is_customize_preview() ) wp_footer(); ?> 189 </body> 190 </html>