Skip to:
Content

BuddyPress.org

Ticket #6592: 6592-posttype.01.patch

File 6592-posttype.01.patch, 21.7 KB (added by DJPaul, 4 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 { 
    295295                        'bp_core_admin_tools'
    296296                );
    297297
    298                 // Fudge the highlighted subnav item when on a BuddyPress admin page.
    299298                foreach( $hooks as $hook ) {
    300299                        add_action( "admin_head-$hook", 'bp_core_modify_admin_menu_highlight' );
    301300                }
    class BP_Admin { 
    767766                                <a href="https://github.com/ichord/At.js">At.js</a>,
    768767                                <a href="https://bbpress.org">bbPress</a>,
    769768                                <a href="https://github.com/ichord/Caret.js">Caret.js</a>,
     769                                <a href="http://tedgoas.github.io/Cerberus/">Cerberus</a>,
    770770                                <a href="https://github.com/carhartl/jquery-cookie">jquery.cookie</a>,
    771771                                <a href="https://www.mediawiki.org/wiki/MediaWiki">MediaWiki</a>,
    772772                                <a href="https://wordpress.org">WordPress</a>.
    class BP_Admin { 
    876876        }
    877877
    878878        /**
     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        /**
    879896         * Register styles commonly used by BuddyPress wp-admin screens.
    880897         *
    881898         * @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 ) { 
    10381038        return $params;
    10391039}
    10401040add_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 */
     1056function 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}
     1096add_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() { 
    25912591
    25922592        return $bp->upload_dir;
    25932593}
     2594
     2595
     2596/** Post Types *****************************************************************/
     2597
     2598/**
     2599 * Output the name of the email post type.
     2600 *
     2601 * @since 2.5.0
     2602 */
     2603function 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 */
     2632function 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 */
     2667function 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 */
     2692function 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 */
     2721function 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 */
     2757function 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 { 
    285285
    286286                parent::setup_cache_groups();
    287287        }
     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        }
    288316}
    289317
    290318/**
  • 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() { 
    2424        register_taxonomy( 'bp_member_type', 'user', array(
    2525                'public' => false,
    2626        ) );
     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        );
    2743}
    2844add_action( 'bp_register_taxonomies', 'bp_register_default_taxonomies' );
    2945
  • 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() { 
    213213                bp_core_install( $default_components );
    214214                bp_update_option( 'bp-active-components', $default_components );
    215215                bp_core_add_page_mappings( $default_components, 'delete' );
     216                bp_core_install_emails();
    216217
    217218        // Upgrades
    218219        } else {
    function bp_version_updater() { 
    260261                if ( $raw_db_version < 9615 ) {
    261262                        bp_update_to_2_3();
    262263                }
     264
     265                // 2.5.0
     266                if ( $raw_db_version < 10440 ) {
     267                        bp_update_to_2_5();
     268                }
    263269        }
    264270
    265271        /** All done! *************************************************************/
    function bp_update_to_2_3() { 
    484490}
    485491
    486492/**
     493 * 2.5.0 update routine.
     494 *
     495 * - Add emails.
     496 *
     497 * @since 2.5.0
     498 */
     499function bp_update_to_2_5() {
     500        bp_core_install_emails();
     501}
     502
     503/**
    487504 * Updates the component field for new_members type.
    488505 *
    489506 * @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 { 
    328328                /** Versions **********************************************************/
    329329
    330330                $this->version    = '2.5.0-alpha';
    331                 $this->db_version = 10071;
     331                $this->db_version = 10440;
    332332
    333333                /** Loading ***********************************************************/
    334334
    class BuddyPress { 
    422422
    423423                $this->current_user   = new stdClass();
    424424                $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' );
    425429        }
    426430
    427431        /**
  • 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/*
     15Based on the Cerberus "Fluid" template by Ted Goas (http://tedgoas.github.io/Cerberus/).
     16License for the original template:
     17
     18
     19The MIT License (MIT)
     20
     21Copyright (c) 2013 Ted Goas
     22
     23Permission is hereby granted, free of charge, to any person obtaining a copy of
     24this software and associated documentation files (the "Software"), to deal in
     25the Software without restriction, including without limitation the rights to
     26use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
     27the Software, and to permit persons to whom the Software is furnished to do so,
     28subject to the following conditions:
     29
     30The above copyright notice and this permission notice shall be included in all
     31copies or substantial portions of the Software.
     32
     33THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     34IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
     35FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
     36COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
     37IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     38CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     39*/
     40
     41// Exit if accessed directly.
     42defined( '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>