WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

If you enter :) in WordPress, it automatically replaces it with:

enter image description here

Is there a way to use a different smiley for the :)

share|improve this question
    
Hi krish, could you provide more details on what you've tried already (and why it didn't work)? – kraftner Feb 22 at 12:32

Overriding the emoji of :) to ๐Ÿ˜Ž

The content smilies are converted with:

add_filter( 'the_content', 'convert_smilies' );

where this part of the convert_smilies() function is of importance:

$content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content );

If we peek into translate_smiley() then we find the following:

// Don't convert smilies that aren't images - they're probably emoji.
if ( ! in_array( $ext, $image_exts ) ) {
     return $img;
}

before the smilies_src filter is applied.

So this filter isn't available in the case of the :) smiley.

We have the smilies initialized with:

add_action( 'init', 'smilies_init', 5 );

and within the function description for smilies_init() we can read the following:

Plugins may override the default smiley list by setting the $wpsmiliestrans to an array, with the key the code the blogger types in and the value the image file.

Here's the global $wpsmiliestrans array:

$wpsmiliestrans = array(
    ':mrgreen:' => 'mrgreen.png',
    ':neutral:' => "\xf0\x9f\x98\x90",
    ':twisted:' => "\xf0\x9f\x98\x88",
    ':arrow:' => "\xe2\x9e\xa1",
    ':shock:' => "\xf0\x9f\x98\xaf",
    ':smile:' => "\xf0\x9f\x99\x82",
    ':???:' => "\xf0\x9f\x98\x95",
    ':cool:' => "\xf0\x9f\x98\x8e",
    ':evil:' => "\xf0\x9f\x91\xbf",
    ':grin:' => "\xf0\x9f\x98\x80",
    ':idea:' => "\xf0\x9f\x92\xa1",
    ':oops:' => "\xf0\x9f\x98\xb3",
    ':razz:' => "\xf0\x9f\x98\x9b",
    ':roll:' => 'rolleyes.png',
    ':wink:' => "\xf0\x9f\x98\x89",
    ':cry:' => "\xf0\x9f\x98\xa5",
    ':eek:' => "\xf0\x9f\x98\xae",
    ':lol:' => "\xf0\x9f\x98\x86",
    ':mad:' => "\xf0\x9f\x98\xa1",
    ':sad:' => "\xf0\x9f\x99\x81",
    '8-)' => "\xf0\x9f\x98\x8e",
    '8-O' => "\xf0\x9f\x98\xaf",
    ':-(' => "\xf0\x9f\x99\x81",
    ':-)' => "\xf0\x9f\x99\x82",
    ':-?' => "\xf0\x9f\x98\x95",
    ':-D' => "\xf0\x9f\x98\x80",
    ':-P' => "\xf0\x9f\x98\x9b",
    ':-o' => "\xf0\x9f\x98\xae",
    ':-x' => "\xf0\x9f\x98\xa1",
    ':-|' => "\xf0\x9f\x98\x90",
    ';-)' => "\xf0\x9f\x98\x89",
    // This one transformation breaks regular text with frequency.
    //     '8)' => "\xf0\x9f\x98\x8e",
    '8O' => "\xf0\x9f\x98\xaf",
    ':(' => "\xf0\x9f\x99\x81",
    ':)' => "\xf0\x9f\x99\x82",
    ':?' => "\xf0\x9f\x98\x95",
    ':D' => "\xf0\x9f\x98\x80",
    ':P' => "\xf0\x9f\x98\x9b",
    ':o' => "\xf0\x9f\x98\xae",
    ':x' => "\xf0\x9f\x98\xa1",
    ':|' => "\xf0\x9f\x98\x90",
    ';)' => "\xf0\x9f\x98\x89",
    ':!:' => "\xe2\x9d\x97",
    ':?:' => "\xe2\x9d\x93",
);

or the nicer ksorted display:

Array
(
    [;-)] => ๐Ÿ˜‰
    [;)] => ๐Ÿ˜‰
    [:|] => ๐Ÿ˜
    [:x] => ๐Ÿ˜ก
    [:wink:] => ๐Ÿ˜‰
    [:twisted:] => ๐Ÿ˜ˆ
    [:smile:] => ๐Ÿ™‚
    [:shock:] => ๐Ÿ˜ฏ
    [:sad:] => ๐Ÿ™
    [:roll:] => rolleyes.png
    [:razz:] => ๐Ÿ˜›
    [:oops:] => ๐Ÿ˜ณ
    [:o] => ๐Ÿ˜ฎ
    [:neutral:] => ๐Ÿ˜
    [:mrgreen:] => mrgreen.png
    [:mad:] => ๐Ÿ˜ก
    [:lol:] => ๐Ÿ˜†
    [:idea:] => ๐Ÿ’ก
    [:grin:] => ๐Ÿ˜€
    [:evil:] => ๐Ÿ‘ฟ
    [:eek:] => ๐Ÿ˜ฎ
    [:cry:] => ๐Ÿ˜ฅ
    [:cool:] => ๐Ÿ˜Ž
    [:arrow:] => โžก
    [:P] => ๐Ÿ˜›
    [:D] => ๐Ÿ˜€
    [:???:] => ๐Ÿ˜•
    [:?:] => โ“
    [:?] => ๐Ÿ˜•
    [:-|] => ๐Ÿ˜
    [:-x] => ๐Ÿ˜ก
    [:-o] => ๐Ÿ˜ฎ
    [:-P] => ๐Ÿ˜›
    [:-D] => ๐Ÿ˜€
    [:-?] => ๐Ÿ˜•
    [:-)] => ๐Ÿ™‚
    [:-(] => ๐Ÿ™
    [:)] => ๐Ÿ™‚
    [:(] => ๐Ÿ™
    [:!:] => โ—
    [8O] => ๐Ÿ˜ฏ
    [8-O] => ๐Ÿ˜ฏ
    [8-)] => ๐Ÿ˜Ž
)

So if I correctly understand the above core comment, then we could do the following:

/**
 * :) as the cool emoji
 */
add_action( 'init', function() use ( &$wpsmiliestrans )
{
    if( is_array( $wpsmiliestrans ) && get_option( 'use_smilies' ) )
        $wpsmiliestrans[':)'] = $wpsmiliestrans[':cool:'];

}, 6 );

but this only works for predefined smiley keys, for the $wp_smiliessearch to work.

But I don't like this suggested approach, modifying the global array! Hopefully there's another one better!

Demo plugin - ๐ŸŽ…

I tried to come up with an application for this. I'm not sure if this already exists, but here it is:

<?php
/**
 * Plugin Name: Santa's Smile In December
 * Description: Change the emoji of :) to the Santa Claus emoji, but only in December
 * Plugin URI:  http://wordpress.stackexchange.com/a/218496/26350
 */
add_action( 'init', function() use ( &$wpsmiliestrans )
{
    // :) as Santa Claus
    if( 
           is_array( $wpsmiliestrans ) 
        && get_option( 'use_smilies' ) 
        && 12 == current_time( 'n' ) 
    )
        $wpsmiliestrans[':)'] = "\xF0\x9F\x8E\x85";

}, 6 );

Thanks to Ismael Miguel for the global comment, I rewrote the snippets accordingly.

Here's the newly created ticket #35905 by Pieter Goosen, regarding a new smilies_trans filter.

share|improve this answer
    
Would the smilies work with every font then? – rob_st Feb 22 at 16:50
    
Strange how different the smileys look between my tab and pc. :-) Anyways, jip, also don't like modifying around with globals, but this seems like the best you are going to get out of this deal. I think we might look into adding a proper filter in core which we can use to filter smileys instead of altering a crappy global. ;-) – Pieter Goosen Feb 22 at 17:57
1  
trac ticket #35905 submitted. Lets cross fingers that we get a proper filter – Pieter Goosen Feb 22 at 18:41
1  
How about add_action( 'init', function() use (&$wpsmiliestrans){ $wpsmiliestrans[':)'] = "\xf0\x9f\x98\x8e"; }, 6 );? – Ismael Miguel Feb 22 at 19:15
    
I've not looked into how the emoji's in general would fail to display rob_st. it will be interesting to follow the ticket @PieterGoosen That's an interesting one-liner Ismael Miguel ;-) – birgire Feb 22 at 19:20

According to the WordPress Codex on using smilies:

Upload the images you want with the same name to your server (say in wp-content/images/smilies) and put this in your theme's function.php:

add_filter( 'smilies_src', 'my_custom_smilies_src', 10, 3 );
   function my_custom_smilies_src($img_src, $img, $siteurl){
       return $siteurl.'/wp-content/images/smilies/'.$img;
   }
That will replace http://example.com/wp-includes/images/smilies/icon_question.gif with http://example.com/wp-content/images/smilies/icon_question.gif

share|improve this answer
    
Not sure why the Codex demo is assuming 10 input arguments, instead of 3? But I think this is overriden by the Emoji's. – birgire Feb 22 at 14:11
1  
I suppose it is meant to be the priority, so the order seems incorrect. I changed it in the Codex, hoping we didn't get it wrong :-) – rob_st Feb 22 at 15:11
    
thanks for fixing the Codex ;-) – birgire Feb 22 at 16:05
    
I have corrected your edit in the codex and corrected your code in your answer. The allowed arguments should be 3, setting it to 1 will fail your code as $img, $siteurl will be ignored and will therefor be undefined in your filter :-) – Pieter Goosen Feb 22 at 19:25

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.