Better Click To Tweet


The most popular Click To Tweet Plugin for WordPress (by a mile), for good reason.

Create tweetable content for your readers, using a simple shortcode or Gutenberg block. Readers are encouraged to tweet out both a quote, and a link to your content.

  • Add Premium Styles with just a few clicks.
  • Using the shortcode method in the classic editor? See our Power User Guide for all the tricks (remove or change the “via,” make links nofollow, change the callback URL, and more!).

Why Better?
Back in the day, there was only one or two options for Click to Tweet plugins. They didn’t do a lot of things I wanted them to do, so I made this plugin. I’m bad at naming things, so “Better Click To Tweet” it is. Since then, I’ve made so many changes and enhancements that any resemblance to the original inspiration plugins are long gone.

Developer? Designer? Geek of any sort? Please hop in and suggest improvements. You can create issues or submit pull requests at the github repository for this plugin.

Translation is managed at the official WordPress translation page.


  • Find our block with a forward slash...
  • ...and adding tweetable content just got EASY.
  • This in the classic editor...
  • Becomes this in your blog post!


This plugin provides 1 block.

Better Click To Tweet


To install the plugin manually in WordPress:

  1. Log in as Admin on your WordPress blog.
  2. Click on the “Plugins” tab in the left menu.
  3. Select “Add New.”
  4. Click on “Upload” at the top of the page.
  5. Select the ‘’ on your computer, and upload. Activate the plugin once it is uploaded.

To install the plugin manually with FTP:

  1. Unzip the ‘’ file. Upload that folder to the ‘/wp-content/plugins/’ directory.
  2. Login to your WordPress dashboard and activate the plugin through the “Plugins” tab in the left menu.


Are there other style options?

Yes! If you are a developer or handy with CSS, there are limitless options for styling.

If you are not a developer, I have released a premium add-on for selecting among several (and growing) different style options. Check out Premium Styles

How does Better Click To Tweet work?

Better Click To Tweet enables you to create beautiful Click To Tweet boxes in your blog posts. Once you’ve installed and activated the plugin, click on the settings link to put in your Twitter username, and save the settings.

Then, wherever you want to insert a Click to Tweet quote, use a shortcode in the format [bctt tweet="xxxxxxxxxxxx"] replacing the xxxxxxx with your tweetable quote.

In the visual editor, you can click the blue birdie icon in the toolbar and a correctly formatted shortcode will be inserted in your text. For more info or clarifications, start a support thread. I’ll actively answer.

How does the URL shortener functionality work?

Better Click To Tweet gives you the maximum number of characters possible. Allow me to explain:

Twitter automatically routes every link through its own URL shortener (you might recognise as the domain they use). For their links, the length is automatically truncated to 23 characters for URLs. This leaves 253 characters after the URL for you to use to compose your tweet. Even a link that is run through or a install is still routed through in the tweet.

The benefit of URL shorteners goes beyond just character length, though. Many users use or a similar service to track numbers of clicks and other analytical data. I personally use to power for my shortened links.

Better Click To Tweet works alongside url shortening plugins to harness that power, if you choose to.

WordPress has a feature called “shortlinks” which changes the long URL to something like Various plugins in the official plugin directory exist to change that shortlink to one using other outside services. Using a combination of those plugins and mine, your Better Click To Tweet boxes can now display a trackable link.

On the settings page for Better Click To Tweet, simply check the box indicating you’d like to use the short URL, and save changes. If you’ve got a plugin that correctly hijacks the built-in WordPress shortlink functionality, you’re all set! I’ve tested my plugin with the following plugins, and will make every effort to keep this list updated:

If you run into any issues with my plugin not working alongside a certain link shortener, start a support thread and include a link to the other plugin. I’ll see what I can do to work with the other developer.

I’ve also written a tutorial for how to set up the shortlinks with and

Are there any other hidden tricks?

Yes! Because I want the majority of users (who aren’t as concerned with options like nofollow links and getting rid of the URL in the tweet) to be happy, most options are hidden. I’ve written a tutorial for using those advanced options. Most of those options are visible in the Gutenberg block, so that tutorial really only applies to the classic editor.

What do I do if it’s not working right?

I am active in the support forums, and in patching the plugin. Start a thread there, and I will gladly help you out. Most of the time you can expect a day or two before a response. I’m in the eastern US, and I like playing with my kids at night, so you might not hear back immediately. Don’t panic.

How can I help?

Issues, feature requests, and Pull Requests:


August 21, 2018
Looks promising but I've been having problem installing it since June and it has not been fixed. I got "The plugin does not have a valid header." when I tried to activate it.
April 9, 2018
I can see why Better Click to Tweet has so many downloads, it's easy to use, and displays so nicely nestled in the text of your page or post. Thanks for a great plugin, Ben!
Read all 39 reviews

Contributors & Developers

“Better Click To Tweet” is open source software. The following people have contributed to this plugin.


“Better Click To Tweet” has been translated into 10 locales. Thank you to the translators for their contributions.

Translate “Better Click To Tweet” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Change log


  • enhancement — new onboarding/welcome wizard to help users maximize their productivity with the plugin.
  • fix — at long last, this plugin doesn’t eat up valuable Top Level Menu space, and all menu items for the free plugin or premium addons are moved to tabs.
  • chore — tested up to 5.3, and listen, if you’re not on at least 5.2 for the massive enhancements like recovery mode, you definitely should be.
  • bonus — people keep giving me extra money when they check out at because they don’t read changelogs. You’ve got a leg up and can get a discount with code CHANGELOG.


  • fix — resolving PHP notices related to the custom URL not being set.
  • fix — resolve outstanding errors around UTM tags add-on integration.
  • chore — tested up to WordPress version 5.2. you should definitely be on 5.2. It’s awesome.
  • bonus — I feel like you people aren’t reading my changelogs. I’m over here handing out discounts, and y’all just keep paying full price. try CHANGELOG to see if you get 10% off!


  • new — created a new nag for the plugins page announcing the UTM tags add-on.
  • new — added a link to the main settings page for folks to check out the new UTM Tags addon.
  • bonus — people who read change logs should get a discount. Use the code CHANGELOG at checkout for 10% off. (good on the bundle, too!)


  • new — adding a filter and various other enhancements to support a new UTM tags add-on
  • fix — testing with the newest version of the block-based editor (Gutenberg)
  • new — added a constant to define the core BCTT version, allowing add-ons to make sure that BCTT core is up to date before activating.


  • fix — two spelling typos in the new License activation page. Thanks to @garrett-eclipse on Github for the fix.
  • fix — on certain installs I was getting a front end notice about an undefined variable. This patch fixes that. Thanks to @dannycooper for the help!


  • fix — replace premium styles page for premium styles users.


  • feature — moved license management for premium add-ons (get them at today!) to the core plugin. Free plugin users will not notice a difference here at all. Premium users: check your email!
  • enhancement — several updates to code comments for clarity.
  • enhancement — the callback URL (from tweet back to website) is now filterable.
  • not much in terms of user-focused enhancements in this release, but a ton happened “under the hood.”


  • fix — added a parameter to the mailing list signup in the admin to help determine where some suspicious signups are originating from.
  • enhancement — gave the readme file a makeover so that the page on the plugin directory is more focused and provides greater value.


  • fix — resolve an error for folks running both WordPress 5.0 and PHP version 5.3.x
  • fix — changes to make the code more legible for humans. But only the total geeks.


  • fix — update language on the settings page about the tweet length (280 character support added earlier, this is updating the help text to reflect that)
  • fix — tested up to WordPress 5.0
  • random — updated the text on the email signup box on the settings page. I don’t offer a PDF any more… It’s more of a email drip sequence at this point.


  • fix — resolving zip problem.


  • fix — another attempt at the “invalid headers” intermittent problem.


  • fix — improving compatibility with WordPress 5.0 and the new block-based (Gutenberg) editor. Thanks again to @ajitbohra for the help
  • fix — resolve “invalid headers” problem on certain new installs


  • Enhancement — added compatibility with WordPress 5.0’s new editor, codenamed Gutenberg (thanks to Ajit Bohra @ajitbohra for all the great work!)
  • Enhancement — Some CSS modifications to make the plugin play nicely with the new editor.
  • Enhancement — changed the twitter bird icon for an updated one on the front end. (Thanks to @oliverpitsch for the PR on Github.)


  • Security fix — added a line to the output that secures the target _blank vulnerability. Thanks to @dmv912 on the wordpress forums for the call-out!


  • Fix — removed a line that was breaking things.


  • Fix — made the settings page more accessible with the help of Rachel Cherry’s fantastic wa11y plugin. Thanks Rachel!
  • Started tinkering with Gutenberg compatibility, the new editor experience coming to WordPress, to make BCTT compatible with the Future of WordPress (no file changes on this, just wanted to let you know it’s on the radar. Learn more at


  • Enhancement — Now supports Twitter’s new 280 character limit. Note that non-roman characters may effect the new truncation in strange ways. Please report any such strangeness to me in the support forums.
  • Enhancement — updated some links in the back end to link to the all new (and still kind of bland)


  • Security Fix — potential XSS vulnerability on settings page. (mild security risk only affecting logged-in administrator accounts previously compromised). Thanks Robbie at DXW @robbiepaul on Github for the responsible disclosure.
  • If the last point didn’t make any sense, please translate it to “UPDATE NOW. Previous versions of the plugin are mildly vulnerable to enterprising attackers.”


  • enhancement — cleaned up the various options checks that were happening on the front end (thanks @igmoweb on GitHub!)
  • Readme changes. I also celebrated a milestone of 20K active installs, which was cause for great celebration, and at least one undocumented happy dance.


  • fix — unused $handle_code variable has been removed. Was causing some errors for folks.
  • fix — code introduced in 5.2 messed up the “via” option and the option to not include the URL. This has been fixed.


  • security fix — adds (more) escaping throughout the plugin. Thanks to Paul de Wouters from HumanMade for the PR!
  • enhancement — tested for compatibility with WordPress core 4.8
  • but seriously, you should check out Premium Styles.


  • enhancement — I added a highly dismissible notice to the plugins page upon update, encouraging people to purchase my Premium styles add-on. The notice only shows to folks who have not previously customised their own styles, and once dismissed will never be shown to that user again.
  • enhancement — I made several changes to the readme file so that the plugin is showcased nicely in the WordPress Plugin Directory’s new design.


  • fix — I was incorrectly calling translation module, breaking things when people updated to the latest version of Yoast SEO.


  • fix — “subscribe” text on plugin settings page was not translatable.
  • New customers are enjoying Premium Styles:


  • enhancement — settings page now looks good on mobile. Before it looked a bit like someone was actively hitting it with a bat.
  • enhancement — added multiple action hooks to the settings page. This provides third party developers with the ability to add things to that page without hacking the core code.
  • enhancement — made the function enqueuing the front end styles DRYer.
  • change — the previous way (version 4.9) I had filtered the function enqueuing styles was throwing PHP warnings when I used it, so I introduced an options-based method for never enqueueing it in the first first place. Updated gist for that: This method will also pave the way for the most exciting update (for me) in the history of Better Click To Tweet:
  • change — introduced the first premium add-on (Premium Styles), and made some changes to the settings page to facilitate that. The goal is threefold: (1) Don’t introduce the option to folks who have already replaced the custom stylesheet using the power user guide or by dequeueing the stylesheet using this gist (2) Introduce the option to purchase custom styles in a non-sleazy way. (3) Um, introduce the option to my tens of thousands of happy users to pay me for something.


  • enhancement — added a ‘prompt’ shortcode attribute, so you can change the words “Click To Tweet” on a per-box basis. Thanks to @apearlman on the support forums for the suggestion!
  • fix — changed the way the shortcode attributes are called, because my IDE kept throwing strange errors because the code wasn’t clean enough.
  • fix — removed some unused local variables because I used to not know how to code things well.
  • dream — thought about ways to monetise this plugin, but ultimately decided against it for now, because I hate dashboard nags. But if you like it, donate:
  • change — decided to go with 4.10 instead of 5.0 in an attempt to move toward a version numbering system that makes sense, because I have learned much since 0.X –> 1.0.
  • just for kicks and totally unrelated — wrote a cool post about rolling back WordPress plugins:


  • enhancement – Made the function that registers and enqueues the scripts filterable, so that developers who want to put all styles for Better Click To Tweet boxes in their theme files are able to do so using this snippet:
  • two updates in a row with no love for the non-developer, but MUCH love for the developer. Trust me, this one is big time for CSS developers to be able to add styles to themes.
  • changed some specifics in the FAQ, and the Readme in general. Encouraged people to donate at


  • made span classes filterable, so that other developers don’t hate me when they try to extend the plugin.
  • I know that first point doesn’t sound like much, but it’s huge for developer geeks. You’re just gonna have to trust me.
  • removed the names of translators from the “description” since they are now being handled by official language packs, and giving credit where it is due was getting complicated.


  • updated links throughout the back end of the plugin to send me money, for people who are into that sort of thing. Shout out to for the SWEET donation integration on my site.


  • added the ability to change the “via” addendum on a per-box basis using the new “username” shortcode attribute. The default behaviour is (still) to go with the username you saved on the settings page.
  • (non-geek explanation of that first point) Now if you have a guest post by @KanyeWest, your Better Click To Tweet box can add “via @KanyeWest” automatically to your reader’s tweets!
  • made some changes to the toolbar popup in the visual editor to facilitate the new “username” attribute, limiting confusion and causing much rejoicing.
  • Made unsuccessful attempt at getting Kanye West to guest post as the ultimate demonstration of the new feature.
  • Tested for compatibility with the upcoming WordPress 4.5, and I don’t mean to sound arrogant, but it pretty much NAILS compatibility with 4.5.
  • Added a module that shows up when a user is using WordPress in a language for which there is incomplete (or non-existent) translations for this plugin. For users where there is a complete (+90%) translation, nothing will show up. But for users where the translation is incomplete, they’ll be encouraged to help with the translation efforts!


  • Removed extra (old and unused) js file.
  • changed some back-end links to go to my new page,
  • realised that my use of tags in the WP repo miiiight have been a touch on the obnoxious and unhelpful side, so now I just use 3.
  • successfully overthrew an oppressive regime in my 5-year-old’s preschool “mystery reader” cartel. Take that, Fox in Socks.


  • Removed call to external Twitter script for security concerns.
  • changed some wording on the description.


  • The click to tweet box is now output as a <span instead of a <div> giving the ability (with custom CSS) to “inline” a click to tweet box.


  • fixed an issue that was causing browsers to load older cached versions of the css.
  • made no noticeable attempts at overthrowing governments, but I did post something on Facebook about Donald Trump which made some waves.


  • updated CSS for compatibility with the Twenty Sixteen theme.
  • updated compatibility to WordPress 4.4.
  • unsuccessful overthrow of all world governments. I would have gotten away with it too, if it weren’t for those meddling kids.


  • fixed bug introduced in v 4.5 incorrectly displaying ellipses on truncated tweets.
  • added Greek translation.


  • fixed issue causing tweets to display incorrectly on iOS Twitter App (thanks to Cameron Conaway for the bug report in the forums)
  • Ampersands are now correctly displayed.
  • began master plan moving toward world domination.


  • Fixed CSS issue with spacing in the default theme.


  • Twitter now opens in a new modal box instead of a new tab, (developers: this is done using a call to within the code of the output from the shortcode. This means that the script won’t be loaded on pages or posts where it’s not needed.)


  • added Italian language


  • added translation support (internationalisation or i18n) to the button on the visual editor. Now the entire plugin is translatable!
  • updated Swedish, Finnish, and Spanish language files.


  • added German and Swedish translations, updated info in readme with link to instructions for migrating from Click To Tweet to Better Click To Tweet.
  • made minor change to the bcttstyle.css (sample) file that was bugging me on hover.


  • added the ability to specify a custom URL as a shortcode parameter. (more info at the power user tutorial at )


  • added Russian translation
  • added sample bcttstyle.css file (for moving to the root of the /uploads folder) to assets/css


  • the plugin now looks for a custom CSS stylesheet before falling back to the default style, giving designers and developers full access to the CSS, without disrupting user experience for folks just looking to plug and play.
  • added Finnish (fi) translation courtesy of Sampsa Daavitsainen at


  • complete overhaul of the visual editor button courtesy @norcross
  • added the ability to make all links “nofollow” by adding the parameter nofollow="yes" to the shortcode.
  • complete overhaul of the settings page for better readability.



  • small change to the outputted URL for vc3 compliance. Thanks to @tomazzaman on Github for the fix!


  • fixed a bug that was creating (rare, server-configuration-related) “Fatal Error” notices for mb_strlen() and related multibyte functions.
  • various code tweaks for readability and compliance with WordPress standards.


  • fixed bug that was causing the URL not to display on certain clicks after the 3.2 update (thanks @aa_stardust for the heads up!)


  • fixed the truncation math given the new options to remove the url (as of 3.2) and via (as of 3.1), to correctly get back all those lost characters.


  • added the ability to leave off the url on a tweet-by-tweet basis (handwritten shortcodes only, the visual editor will not show it as an option on the popup window)
  • code modifications for clarity.


  • added the ability to leave off the via @YourTwitterName on a tweet-by-tweet basis.
  • complete overhaul of the JavaScript file to enable that functionality without having to mess with hand-coding the shortcode.


  • added option to use WordPress shortlink in place of full URL.
  • further refinement of the math used in calculating tweet truncation length.


  • updated CSS to remove underline on “Click to Tweet” on Twenty Fifteen theme (and others!)


  • fixed bug introduced in 2.0 related to JavaScript.


  • added in support for RSS feeds: when outputting to an RSS feed, the click-to-tweet text will be smartly formatted.
  • added CSS declarations to deal with issues in the Twenty Fifteen theme.
  • readme enhancements for better user experience.


  • Major version release for internationalisation: added Spanish (ES) translation, and updated code throughout for internationalisation. Still to-do: add translation support for the TinyMCE plugin on the visual editor.


  • updated the tweet length math to correctly parse text with non-standard characters. Thanks to WordPress forum user zachop at for the tip.
  • various code cleanup issues, to make my code more readable and compliant with WordPress standards.


  • rescued nine characters that were being stolen by some incorrect math in my tweet-generating function. Now tweets won’t be truncated until they actually need to be.


  • added margin on the bottom of the bcct-clicktotweet div


  • fixed a bug that was not displaying the CSS correctly.
  • updated the FAQ and other readme items.


  • Initial release.