728x90

PHP Fatal error: Uncaught Error: Class 'WP_User' not found

PHP Fatal error:  Cannot redeclare eto_shortcode_image()


These moment is happened. For, WP_User class is not re-declare.  So I shoot trouble the same method as like this, which 


<code>

if(!isset($wpdb))

{

    //the '../' is the number of folders to go up from the current file to the root-map.

    include_once($_SERVER['DOCUMENT_ROOT'].'wp-config.php');

    include_once($_SERVER['DOCUMENT_ROOT'].'wp-includes/wp-db.php');

}

</code>


Also, it is the trouble that below code. 


if( isset($_GET['page']) AND $_GET['page'] == 'eto-settings' ) {

include($eto_base_dir . '/includes/styles.php');

include($eto_base_dir . '/includes/options.php');

include($eto_base_dir . '/includes/functions/eto_functions.php');

include($eto_base_dir . '/includes/scripts.php');

include($eto_base_dir . '/includes/help.php');

}


include($eto_base_dir . '/includes/shortcodes.php');


in easy-theme-option, if you are used to Ajax,  modify  below.



if( isset($_GET['page']) AND $_GET['page'] == 'eto-settings' ) {

include_once($eto_base_dir . '/includes/styles.php');

include_once($eto_base_dir . '/includes/options.php');

include_once($eto_base_dir . '/includes/functions/eto_functions.php');

include_once($eto_base_dir . '/includes/scripts.php');

include_once($eto_base_dir . '/includes/help.php');

}


include_once($eto_base_dir . '/includes/shortcodes.php');


728x90

dmin pages are the heart and soul of plugins.

It’s easy to assume they are complex form-filled monsters, the sole purpose of which is to gather data from the user. The truth is, admin pages provide a familiar place to welcome new users, provide information, and display details for support and documentation.

In this short tutorial we’ll take a look at the basics of how to add these pages to the backend of WordPress. You can then combine this knowledge with other tutorials to create tabbed pages, AJAX functionality, overlays and more.

The Components of an Admin Page

There are two or three components to an admin page, depending on the functionality you are building:

  1. A menu entry – top-level or sub-level
  2. The page content
  3. Processing logic for forms – if needed

For the purposes of this tutorial we will not be looking at forms and form processing, we’ll leave that for another day. Right now what we’ll be concerned with is how to put the pages themselves into place.

Top-Level and Sub-Level Menus

There are two types of menu entries: Top-level and sub-level. I recommend – as does the WordPress Codex – that you think about whether your plugin really needs a top-level menu entry. Too many plugins add top-level entries, which end up polluting the admin heavily.

WordTwit

One example is WordTwit, which tweets new content. It is a great plugin, but it adds a top-level entry unnecessarily.

This is completely unnecessary, an entry in the settings section would do just fine. Some plugins like WooCommerce, bbPress and others add top level items validly; it really depends on how users interact with your product.

A good rule of thumb is: If users need to interact with your plugin daily you can use a top-level entry. If your admin page is just for settings, a sub-level entry in the Settings top-level menu is more appropriate.

Creating a Top-Level Admin Page

The first step is to create a menu entry with the add_menu_page()function. Here’s a full example, explanation ensues:

add_action( 'admin_menu', 'my_admin_menu' );
function my_admin_menu() {
add_menu_page( 'My Top Level Menu Example', 'Top Level Menu', 'manage_options', 'myplugin/myplugin-admin-page.php', 'myplguin_admin_page', 'dashicons-tickets', 6 );
}
view rawtop-level.php hosted with ❤ by GitHub

The function takes seven arguments. The first one is the page title, which defines the title tag; it is shown in the tab title, not on screen.

The second argument is the title that shows up in the menu.

Argument three is the capability required to access the menu. This can be used to restrict it to only admins, editors or authors.

Argument four is the menu slug, which is essentially used as the URL of the page.

Argument five is the function, which will handle the content of the page.

The next argument is the icon url. This can accept a number of formats. If a URL to an image is given the image will be used. You can also use Dashicons, which are built into WordPress, or even SVG.

The last argument defines where the menu will be placed. Argument five indicated the posts so I’ve used six to put this menu entry just underneath. Take a look at the Codex to see exactly what number to use for your desired position.

The next step is to create some content. All you need to do is create the function defined in argument five and echo some content. Here’s a very simple example you can start with:

function myplguin_admin_page(){
?>
<div class="wrap">
<h2>Welcome To My Plugin</h2>
</div>
<?php
}
view rawsimple-page.php hosted with ❤ by GitHub

Creating a Sub-Level Admin Page

There are quite a few functions you can use to add sub-level pages. The general add_submenu_page() will let you put sub-level entries anywhere, but all built-in top level pages have their own functions:

  • To add a menu item under posts use add_posts_page
  • To add a menu item under pages use add_pages_page
  • To add a menu item under media use add_media_page
  • To add a menu item under links use add_links_page
  • To add a menu item under comments use add_comments_page
  • To add a menu item under appearance use add_theme_page
  • To add a menu item under plugins use add_plugin_page
  • To add a menu item under users use add_users_page
  • To add a menu item under tools use add_management_page
  • To add a menu item under settings use add_options_page

Each of these functions follow the same format: add_comments_page( $page_title, $menu_title, $capability, $menu_slug, $function);. The arguments should be familiar from our top-level example above.

You may want to add a sub-level menu to your own top level, in which case these specific function won’t be of much use to you. You’ll need to use add_submenu_page(). Let’s use this function to add an entry under our top level one created above:

add_action( 'admin_menu', 'my_admin_menu' );
function my_admin_menu() {
add_menu_page( 'My Top Level Menu Example', 'Top Level Menu', 'manage_options', 'myplugin/myplugin-admin-page.php', 'myplguin_admin_page', 'dashicons-tickets', 6 );
add_submenu_page( 'myplugin/myplugin-admin-page.php', 'My Sub Level Menu Example', 'Sub Level Menu', 'manage_options', 'myplugin/myplugin-admin-sub-page.php', 'myplguin_admin_sub_page' );
}
view rawsub-level.php hosted with ❤ by GitHub

As you can see this function is almost identical to the specific functions above, except for the first argument which specifies the slug of the parent element. In our case, this is myplugin/myplugin-admin-page.php.

Conclusion

As you can see, adding menu entries and displaying content is quite easy. The difficulty starts once this has been done. What to put on the page, how to arrange it, using Javascript and CSS to make the presentation great, making sure forms are secure and validated etc. These are things we’ll be taking a look at in future tutorials.

The goal of this article is to give you an understanding of the basics of menu and admin page creation so you can refer back to it when needed. Hopefully you can now create pages for your products. We’ll be tackling specific use-cases in another article soon.

Are there any specific use-cases you would like us to put together? Let us know in the comments below.

728x90

I'm writing a plugin and trying to request some data from a custom table in my database using:

$current_text = $wpdb->get_results("SELECT text FROM addtext ORDER BY id DESC LIMIT 1");

but just get the error Undefined variable: wpdb

Any idea why this isn't working? I've followed the docs and scoured Google, with no luck. Still pretty new to WP plugins so probably something obvious.

Thanks!

I needed to use global $wpdb; in my function.

    One note to add: You cannot use global inside a class, and of course you have to use global in order to get your objects to work using $wpdb.

    While you can't use global immediately inside a class, you must declare $wpdb as global inside a function inside the class, and this does work.

    e.g. This gives you an error:

    class wpdb_test {
            global $wpdb; // can't use global as a direct 'child' of a class
            public function __construct () {
                ...
            }
    }

    Because global can't be used directly inside a class. Likewise, simply referencing $wpdb inside the class also gives you an error because the object doesn't know what $wpdb is. You have to declare $wpdb as global from inside a function that is inside your class.

    e.g. This works just fine:

    class wpdb_test {
            public $variable_name;
            public function __construct () {
                global $wpdb; // safe to use because it's inside a function
                ...
            }
    }

    ...and because $wpdb has been declared global inside a function inside a class you are able to use it.


    728x90

    Description Description

    A true return value does not automatically mean that the user received the email successfully. It just only means that the method used was able to process the request without any errors.

    Using the two ‘wp_mail_from’ and ‘wp_mail_from_name’ hooks allow from creating a from address like ‘Name email@address.com‘ when both are set. If just ‘wp_mail_from’ is set, then just the email address will be used with no name.

    The default content type is ‘text/plain’ which does not allow using HTML. However, you can set the content type of the email by using the ‘wp_mail_content_type’ filter.

    The default charset is based on the charset used on the blog. The charset can be set using the ‘wp_mail_charset’ filter.


    Parameters Parameters

    $to

    (string|array) (Required) Array or comma-separated list of email addresses to send message.

    $subject

    (string) (Required) Email subject

    $message

    (string) (Required) Message contents

    $headers

    (string|array) (Optional) Additional headers.

    Default value: ''

    $attachments

    (string|array) (Optional) Files to attach.

    Default value: array()


    Top ↑

    Return Return

    (bool) Whether the email contents were sent successfully.


    Top ↑

    Source Source

    File: wp-includes/pluggable.php

    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
        // Compact the input, apply the filters, and extract them back out
     
        /**
         * Filters the wp_mail() arguments.
         *
         * @since 2.2.0
         *
         * @param array $args A compacted array of wp_mail() arguments, including the "to" email,
         *                    subject, message, headers, and attachments values.
         */
        $atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );
     
        if ( isset( $atts['to'] ) ) {
            $to = $atts['to'];
        }
     
        if ( !is_array( $to ) ) {
            $to = explode( ',', $to );
        }
     
        if ( isset( $atts['subject'] ) ) {
            $subject = $atts['subject'];
        }
     
        if ( isset( $atts['message'] ) ) {
            $message = $atts['message'];
        }
     
        if ( isset( $atts['headers'] ) ) {
            $headers = $atts['headers'];
        }
     
        if ( isset( $atts['attachments'] ) ) {
            $attachments = $atts['attachments'];
        }
     
        if ( ! is_array( $attachments ) ) {
            $attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
        }
        global $phpmailer;
     
        // (Re)create it, if it's gone missing
        if ( ! ( $phpmailer instanceof PHPMailer ) ) {
            require_once ABSPATH . WPINC . '/class-phpmailer.php';
            require_once ABSPATH . WPINC . '/class-smtp.php';
            $phpmailer = new PHPMailer( true );
        }
     
        // Headers
        $cc = $bcc = $reply_to = array();
     
        if ( empty( $headers ) ) {
            $headers = array();
        } else {
            if ( !is_array( $headers ) ) {
                // Explode the headers out, so this function can take both
                // string headers and an array of headers.
                $tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) );
            } else {
                $tempheaders = $headers;
            }
            $headers = array();
     
            // If it's actually got contents
            if ( !empty( $tempheaders ) ) {
                // Iterate through the raw headers
                foreach ( (array) $tempheaders as $header ) {
                    if ( strpos($header, ':') === false ) {
                        if ( false !== stripos( $header, 'boundary=' ) ) {
                            $parts = preg_split('/boundary=/i', trim( $header ) );
                            $boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) );
                        }
                        continue;
                    }
                    // Explode them out
                    list( $name, $content ) = explode( ':', trim( $header ), 2 );
     
                    // Cleanup crew
                    $name    = trim( $name    );
                    $content = trim( $content );
     
                    switch ( strtolower( $name ) ) {
                        // Mainly for legacy -- process a From: header if it's there
                        case 'from':
                            $bracket_pos = strpos( $content, '<' );
                            if ( $bracket_pos !== false ) {
                                // Text before the bracketed email is the "From" name.
                                if ( $bracket_pos > 0 ) {
                                    $from_name = substr( $content, 0, $bracket_pos - 1 );
                                    $from_name = str_replace( '"', '', $from_name );
                                    $from_name = trim( $from_name );
                                }
     
                                $from_email = substr( $content, $bracket_pos + 1 );
                                $from_email = str_replace( '>', '', $from_email );
                                $from_email = trim( $from_email );
     
                            // Avoid setting an empty $from_email.
                            } elseif ( '' !== trim( $content ) ) {
                                $from_email = trim( $content );
                            }
                            break;
                        case 'content-type':
                            if ( strpos( $content, ';' ) !== false ) {
                                list( $type, $charset_content ) = explode( ';', $content );
                                $content_type = trim( $type );
                                if ( false !== stripos( $charset_content, 'charset=' ) ) {
                                    $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) );
                                } elseif ( false !== stripos( $charset_content, 'boundary=' ) ) {
                                    $boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) );
                                    $charset = '';
                                }
     
                            // Avoid setting an empty $content_type.
                            } elseif ( '' !== trim( $content ) ) {
                                $content_type = trim( $content );
                            }
                            break;
                        case 'cc':
                            $cc = array_merge( (array) $cc, explode( ',', $content ) );
                            break;
                        case 'bcc':
                            $bcc = array_merge( (array) $bcc, explode( ',', $content ) );
                            break;
                        case 'reply-to':
                            $reply_to = array_merge( (array) $reply_to, explode( ',', $content ) );
                            break;
                        default:
                            // Add it to our grand headers array
                            $headers[trim( $name )] = trim( $content );
                            break;
                    }
                }
            }
        }
     
        // Empty out the values that may be set
        $phpmailer->clearAllRecipients();
        $phpmailer->clearAttachments();
        $phpmailer->clearCustomHeaders();
        $phpmailer->clearReplyTos();
     
        // From email and name
        // If we don't have a name from the input headers
        if ( !isset( $from_name ) )
            $from_name = 'WordPress';
     
        /* If we don't have an email from the input headers default to wordpress@$sitename
         * Some hosts will block outgoing mail from this address if it doesn't exist but
         * there's no easy alternative. Defaulting to admin_email might appear to be another
         * option but some hosts may refuse to relay mail from an unknown domain. See
         */
     
        if ( !isset( $from_email ) ) {
            // Get the site domain and get rid of www.
            $sitename = strtolower( $_SERVER['SERVER_NAME'] );
            if ( substr( $sitename, 0, 4 ) == 'www.' ) {
                $sitename = substr( $sitename, 4 );
            }
     
            $from_email = 'wordpress@' . $sitename;
        }
     
        /**
         * Filters the email address to send from.
         *
         * @since 2.2.0
         *
         * @param string $from_email Email address to send from.
         */
        $from_email = apply_filters( 'wp_mail_from', $from_email );
     
        /**
         * Filters the name to associate with the "from" email address.
         *
         * @since 2.3.0
         *
         * @param string $from_name Name associated with the "from" email address.
         */
        $from_name = apply_filters( 'wp_mail_from_name', $from_name );
     
        try {
            $phpmailer->setFrom( $from_email, $from_name, false );
        } catch ( phpmailerException $e ) {
            $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
            $mail_error_data['phpmailer_exception_code'] = $e->getCode();
     
            /** This filter is documented in wp-includes/pluggable.php */
            do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );
     
            return false;
        }
     
        // Set mail's subject and body
        $phpmailer->Subject = $subject;
        $phpmailer->Body    = $message;
     
        // Set destination addresses, using appropriate methods for handling addresses
        $address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' );
     
        foreach ( $address_headers as $address_header => $addresses ) {
            if ( empty( $addresses ) ) {
                continue;
            }
     
            foreach ( (array) $addresses as $address ) {
                try {
                    // Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
                    $recipient_name = '';
     
                    if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) {
                        if ( count( $matches ) == 3 ) {
                            $recipient_name = $matches[1];
                            $address        = $matches[2];
                        }
                    }
     
                    switch ( $address_header ) {
                        case 'to':
                            $phpmailer->addAddress( $address, $recipient_name );
                            break;
                        case 'cc':
                            $phpmailer->addCc( $address, $recipient_name );
                            break;
                        case 'bcc':
                            $phpmailer->addBcc( $address, $recipient_name );
                            break;
                        case 'reply_to':
                            $phpmailer->addReplyTo( $address, $recipient_name );
                            break;
                    }
                } catch ( phpmailerException $e ) {
                    continue;
                }
            }
        }
     
        // Set to use PHP's mail()
        $phpmailer->isMail();
     
        // Set Content-Type and charset
        // If we don't have a content-type from the input headers
        if ( !isset( $content_type ) )
            $content_type = 'text/plain';
     
        /**
         * Filters the wp_mail() content type.
         *
         * @since 2.3.0
         *
         * @param string $content_type Default wp_mail() content type.
         */
        $content_type = apply_filters( 'wp_mail_content_type', $content_type );
     
        $phpmailer->ContentType = $content_type;
     
        // Set whether it's plaintext, depending on $content_type
        if ( 'text/html' == $content_type )
            $phpmailer->isHTML( true );
     
        // If we don't have a charset from the input headers
        if ( !isset( $charset ) )
            $charset = get_bloginfo( 'charset' );
     
        // Set the content-type and charset
     
        /**
         * Filters the default wp_mail() charset.
         *
         * @since 2.3.0
         *
         * @param string $charset Default email charset.
         */
        $phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );
     
        // Set custom headers
        if ( !empty( $headers ) ) {
            foreach ( (array) $headers as $name => $content ) {
                $phpmailer->addCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
            }
     
            if ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) )
                $phpmailer->addCustomHeader( sprintf( "Content-Type: %s;\n\t boundary=\"%s\"", $content_type, $boundary ) );
        }
     
        if ( !empty( $attachments ) ) {
            foreach ( $attachments as $attachment ) {
                try {
                    $phpmailer->addAttachment($attachment);
                } catch ( phpmailerException $e ) {
                    continue;
                }
            }
        }
     
        /**
         * Fires after PHPMailer is initialized.
         *
         * @since 2.2.0
         *
         * @param PHPMailer $phpmailer The PHPMailer instance (passed by reference).
         */
        do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
     
        // Send!
        try {
            return $phpmailer->send();
        } catch ( phpmailerException $e ) {
     
            $mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
            $mail_error_data['phpmailer_exception_code'] = $e->getCode();
     
            /**
             * Fires after a phpmailerException is caught.
             *
             * @since 4.4.0
             *
             * @param WP_Error $error A WP_Error object with the phpmailerException message, and an array
             *                        containing the mail recipient, subject, message, headers, and attachments.
             */
            do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );
     
            return false;
        }
    }

    Top ↑

    Changelog Changelog

    Changelog
    VersionDescription
    1.2.1Introduced.

    Top ↑

    More Information More Information

    Top ↑

    Usage Usage

    1
    wp_mail( $to, $subject, $message, $headers, $attachments );

    Optional filters ‘wp_mail_from‘ and ‘wp_mail_from_name‘ are run on the sender email address and name. The return values are reassembled into a ‘from’ address like ‘”Example User” ‘ If only ‘wp_mail_from‘ returns a value, then just the email address will be used with no name.

    The default content type is ‘text/plain’ which does not allow using HTML. You can set the content type of the email either by using the ‘wp_mail_content_type‘ filter ( see example below), or by including a header like “Content-type: text/html”. Be careful to reset ‘wp_mail_content_type’ back to ‘text/plain’ after you send your message, though, because failing to do so could lead to unexpected problems with e-mails from WP or plugins/themes.

    The default charset is based on the charset used on the blog. The charset can be set using the ‘wp_mail_charset‘ filter.

    Top ↑

    Notes Notes

    • true return value does not automatically mean that the user received the email successfully.
    • For this function to work, the settings SMTP and smtp_port (default: 25) need to be set in your php.ini file.
    • The function is available after the hook 'plugins_loaded'.
    • The filenames in the $attachments attribute have to be filesystem paths.

    Top ↑

    Valid Address Formats Valid Address Formats

    All email addresses supplied to wp_mail() as the $to parameter must comply with RFC 2822. Some valid examples:

    • user@example.com
    • user@example.com, anotheruser@example.com
    • User <user@example.com>
    • User <user@example.com>, Another User <anotheruser@example.com>

    The same applies to Cc: and Bcc: fields in $headers, but as noted in the next section, it’s better to push multiple addresses into an array instead of listing them on a single line. Either address format, with or without the user name, may be used.

    Top ↑

    Using $headers To Set “From:”, “Cc:” and “Bcc:” Parameters Using $headers To Set “From:”, “Cc:” and “Bcc:” Parameters

    To set the “From:” email address to something other than the WordPress default sender, or to add “Cc:” and/or “Bcc:” recipients, you must use the $headers argument.

    $headers can be a string or an array, but it may be easiest to use in the array form. To use it, push a string onto the array, starting with “From:”, “Bcc:” or “Cc:” (note the use of the “:”), followed by a valid email address.

    When you are using the array form, you do not need to supply line breaks ("\n" or "\r\n"). Although the function can handle multiple emails per line, it may simply be easier to push each email address separately onto the $headers array. The function will figure it out and will build the proper Mime header automagically. Just don’t forget that each string you push must have the header type as the first part of the string (“From:”, “Cc:” or “Bcc:”)



    Top ↑

    User Contributed Notes User Contributed Notes

    1. Skip to note content
      Contributed by Codex — 

      To send HTML formatted mail, you also can specify the Content-Type HTTP header in the $headers parameter:

      1
      2
      3
      4
      5
      6
      $to = 'sendto@example.com';
      $subject = 'The subject';
      $body = 'The email body content';
      $headers = array('Content-Type: text/html; charset=UTF-8');
       
      wp_mail( $to, $subject, $body, $headers );
    2. Skip to note content
      Contributed by Codex — 

      Example using the array form of $headers:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <?php
      // assumes $to, $subject, $message have already been defined earlier...
       
      $headers[] = 'From: Me Myself <me@example.net>';
      $headers[] = 'Cc: John Q Codex <jqc@wordpress.org>';
      $headers[] = 'Cc: iluvwp@wordpress.org'; // note you can just use a simple email address
       
      wp_mail( $to, $subject, $message, $headers );
      ?>
    3. Skip to note content
      Contributed by stratboy — 

      Here’s an example of a basic configuration for SMTP (so phpmailer will be used instead of php’s mail()):

      1
      2
      3
      4
      5
      6
      7
      8
      add_action( 'phpmailer_init', 'mailer_config', 10, 1);
      function mailer_config(PHPMailer $mailer){
        $mailer->IsSMTP();
        $mailer->Host = "mail.telemar.it"; // your SMTP server
        $mailer->Port = 25;
        $mailer->SMTPDebug = 2; // write 0 if you don't want to see client/server communication in page
        $mailer->CharSet  = "utf-8";
      }

      Here’s an example of a basic error logging:

      1
      2
      3
      4
      5
      6
      7
      add_action('wp_mail_failed', 'log_mailer_errors', 10, 1);
      function log_mailer_errors(){
        $fn = ABSPATH . '/mail.log'; // say you've got a mail.log file in your server root
        $fp = fopen($fn, 'a');
        fputs($fp, "Mailer Error: " . $mailer->ErrorInfo ."\n");
        fclose($fp);
      }

      Then use wp_mail() to send your mail.

      If you’re using it for sending a form and your form’s action is the page’s permalink, you can do some basic checking for $_POST lenght/count to see if the page comes from a form submission.

      1
      2
      3
      4
      if(count($_POST) != 0){ // on top of page
        // Then collect form data and try to send the form and write messages and so on...
        // Note: set $mailer-&gt;SMTPDebug to 0 to prevent it to write server messages on the page
      }

      NOTE: if you are using MAMP PRO to test from your local server, you should:

      – go to the Postfix panel
      – write your current virtual server as the ‘domain of outgoing email’
      – activate ‘use a smart host for routing’
      – write your provider’s smtp server (the same you are using in your mail client config)
      – Eventually add authentication (then you should also setup the credentials in the phpmailer_init action)

    4. Skip to note content
      Contributed by daniyalahmedk — 

      Combining Content-Type(HTML) and From (Site name and “from” email)

      1
      2
      3
      4
      5
      6
      $to = 'emailsendto@example.com';
      $subject = 'The subject';
      $body = 'The email body content';
      $headers = array('Content-Type: text/html; charset=UTF-8','From: My Site Name &lt;support@example.com');
       
      wp_mail( $to, $subject, $body, $headers );
    5. Skip to note content
      Contributed by Codex — 

      Switch to HTML formatted email (using the wp_mail_content_type filter):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      <?php
      add_filter( 'wp_mail_content_type', 'wpdocs_set_html_mail_content_type' );
       
      $to = 'sendto@example.com';
      $subject = 'The subject';
      $body = 'The email body content';
       
      wp_mail( $to, $subject, $body );
       
      // Reset content-type to avoid conflicts -- https://core.trac.wordpress.org/ticket/23578
      remove_filter( 'wp_mail_content_type', 'wpdocs_set_html_mail_content_type' );
       
      function wpdocs_set_html_mail_content_type() {
          return 'text/html';
      }
      ?>
    6. Skip to note content
      Contributed by Mark Howells-Mead — 

      If you need to set the Reply-To address, note that the syntax which PHPMailer needs is pretty specific. The email address must be enclosed within <> characters. It’s also advisable to set the “reply to” name.

      1
      2
      3
      $headers = array(
        'Reply-To: Person Name <person.name@example.com>',
      );
    7. Skip to note content
      Contributed by drbobjr — 

      Having spent nearly a day banging my head against this one, I would strongly recommend that the doc for wp_mail() include the tip that many servers will require that a mail user account be created with the email address of wordpress@domain.com before this function will work. I would have NEVER figured that one out without many hours of google searches.

    8. Skip to note content
      Contributed by jmikewp — 

      As of 4.6 header from can’t be a post variable, need to be set before otherwise your site will show php error “Fatal error: Uncaught exception ‘phpmailerException’ with message ‘Invalid address: (setFrom)”

      This is due to ‘from email’ being set as variable and is not yet being passed by form submit.

      1
      $headers = "From: $name <$email>" . "\r\n";

      Fix by predefining a variable for both $name and $email that will be overwritten after submit(ex.1), or set hardcoded(ex.2).
      ex.1

      1
      2
      3
      4
      5
      6
      $name = "Site name";
      $email = "info@sitename.com";
      if(isset $_POST["name"]){
      $name = sanitize_text_field($_POST["name"]);
      $email = sanitize_email($_POST["email"]);
      }

      ex.2

      1
      $headers = "From: Site name <info@sitename.com>" . "\r\n";
    9. Skip to note content
      Contributed by Louis-Marie Matthews — 

      It’s important to know that this function might fail if you specify an empty body, even if using a SMTP.

      1
      wp_mail( 'email@provider.com', 'Subject', '' ); // returns false, the email was not sent
      1
      wp_mail( 'email@provider.com', 'Subject', 'Body' ); // returns true (if everything else is working)

    You must log in before being able to contribute a note or feedback.


    + Recent posts