Republic Wireless Review After 18 Months On The Service

Hey, remember that time I switched my cell phone service from AT&T to Republic Wireless? Since that day, I’ve pocketed about $1800 in savings. I did spend $600 on two phones, so it took some time to break even. But, it’s about time to revisit the subject with a review of the service so far, with the luxury of 18 months of usage.

TL;DR version: why in the world are you still paying hundreds of dollars per month per smartphone? Sign up today and switch.

First, the “bad.” The key to this whole affair is wifi calling, so if you don’t have a strong wifi signal where you are most of the time, it’s not worth it. Also, since I work and live in a spot known for bad cell reception (regardless of carrier) there have been some dropped calls when switching off of the wifi network. It was worse early on.

What I keep coming back to is this: is it annoying to drop a call, or to have to wait 6 seconds for a call to connect? Yes. But it’s not as annoying as spending $100 more per month, by a long shot.

Now, the good. Dealing with this company has been a breath of fresh air. I had a great Republic Wireless shirt that was my favorite, and accidentally got some bleach on it while cleaning the bathroom at home. So, I tweeted at them and got an immediate response:

Instead of just mailing me a shirt (which would be above-and-beyond anything AT&T ever did for me as a customer), they sent a freaking care package:

https://twitter.com/benUNC/status/614004174389383168

It’s almost like they are running this thing for the benefit of their customers, not their shareholders. That’s a novel idea.</sarcasm>

Company culture aside, the other thing that has blown me away has been that they don’t seem to be trying to get me to upgrade my 18-month-old phone, because they are still supporting it by working hard to release updates for the software!

I used and supported top shelf Android phones when I worked at AT&T. Not a single one of them ever received a major software update to the next version of Android at the 18-month mark. AT&T wants you to do one thing only at the 18-month mark: re-sign a contract. I can’t fault them for that, but it sure is refreshing to have a company that seems to be content to wait until my phone is actually obsolete before they toss it aside. I’ll keep you posted, but I’m hoping to make it at least to the 3 year mark before I’m swallowed up by my own need for the latest hardware.

The bottom line is that knowing what I do today, I’d only change one thing about switching to Republic Wireless:

I’d switch sooner.

If you do end up switching, it can’t hurt to use my referral link: http://benlikes.us/republic

Broken Websites, Automatic Updates, and Roadside Assistance

It's the automatic updater's fault your tire went flat, and other absurd thoughts.
It’s the automatic updater’s fault your tire went flat, and other absurd thoughts. Creative Commons Image Attribution

Automatic updates broke your site? No, your lack of planning broke your site.

Last week a security fix was pushed via automatic update to self-hosted WordPress users. The behind-the-scene details are inconsequential, but the gist is that the core team was made aware of a potential security issue related to the Shortcode API.

When you read the words “potential security issue” what that means is that WordPress (which powers about a quarter of the entire Internet) has a hole that the right malicious user could use to write a script to corrupt/infect as many sites and servers as possible. Depending on the level of severity, up to the entire 25% of the Internet could be affected.

Let that sink in.

So, when an issue comes up (there are proper ways of reporting it) the core team can either broadcast to all plugin developers that a fix is coming out and functionally disclose the hole to a wider audience, or they can issue the fix, and “break” some sites while preventing hackers from having even one more minute to discover a backdoor into 25% of the internet.

Perhaps it's time to stop treating website maintenance like a surprise expense. Share on XLeaving aside the fact that you attached yourself (for no cost) to this behemoth powering a quarter of the web with the expectation of it doing always and only things in your best interest, which is fodder for another (more pointed) post, perhaps it’s time to stop treating website maintenance like a surprise expense.

You need to prepare for automatic updates which break things in the same way you should plan on flat tires in your car or power outages in your office. They will happen. In the vast majority of cases, automatic updates have not “broken” anything. People don’t even notice them as they slam the door shut on hackers.

But every now and then the core team has to make the call to save millions of sites from male enhancement ads, with the unfortunate side effect of having some of those sites not display shortcodes properly until you fix a plugin. It’s the cost of a large-scale operation

Have a plan. When your car blows a tire, your mechanic’s roadside assistance plans pays for itself multiple times over.

Oh, and yeah, I can be that mechanic, if you’d like.

WordPress Developers: This One Thing Made Me Thousands This Year

Like my grandma always said.
Like my grandma always said.
You want to stand out, get noticed, and make more money? Be nice.

I’m a freelance WordPress plugin developer who is maniacal about polite, prompt support ticket response. So far it has made me about $3000 over the last 10 months, plus one brand called about acquiring me and my plugin.

Free product + free support + prompt polite developer = $$ + opportunity

So many support requests come across my desk begging for a  “YOU SHOULD HAVE READ THE BLEEPING MANUAL” response.

Face it:

  1. People don’t read FAQs.
  2. People don’t scour forums for answers.
  3. People certainly don’t pay for support for a free plugin.

Instead, they open the support forums, create a new topic (or worse, tack their request onto the end of a resolved ticket), and blast off the same inane support request that you’ve answered (what feels like) 250 times.

That request may frustrate you, because you are the one who has answered it (what feels like) 250 times. This user? They’ve never come across it, and you have one chance to help them have a good first impression of you.

So far, I’ve gotten 3 monthly recurring clients for backups, maintenance, and now even hosting, from being nice to a stranger on the forums for my free plugins.

I’m working on a pretty great conversion rate, too. 19 tickets for one plugin and 30 tickets for the other, with 3 monthly clients now representing roughly $200 in recurring revenue, so far. That doesn’t count the handful of one-off code fixes and other things that I’ve contracted to do for folks after first meeting them in the forums. Those have grossed about $2000 total so far.

My oldest plugin is not even a year old yet. Could you handle an extra $3000 in your pocket* from being nice this year?

Could you handle an extra $3,000 in your pocket from using a grade-school trick? Share on X

Start by acknowledging that you’ve forgotten what it’s like to be an outsider to the WordPress community, and a novice user. Then answer every question like it’s your best friend asking it.

Just because you know to check the FAQ, do a simple Google search, or run down a list of possible solutions to the problem doesn’t mean that your users will, or even should.

My first inclination when I run into requests that are absurd or that could have been easily answered with a lmgtfy.com link is to assume the user is intentionally trying to be a jerk. They clearly know they are freeloading, and expecting not only a premium quality product, but also 24-7-365 service on that product, for free.

But that’s the thing: In most cases, the user has no idea they are being unreasonable, and if you gently answer the question you go a long way toward helping them to see their own absurdity.

Most of the time, novice users don't know their free support requests are unreasonable. You have to teach them. Share on X

Now, I don’t mean you need to get walked all over by entitled users who think everything should be free. A stock phrase I use often in support requests is “that falls outside the scope of the free support I’m able to offer here.” (coincidentally, that’s the exact phrase which has led to multiple ongoing financial relationships)

But I suppose this is all still anecdotal at this point, but it sure seems like the way any developer can stand out (and make some great spare coin) is to decide to be nice. I can assure you of one thing: here inside the anecdote, it’s quite pleasant.

*the governments of both these United States and my specific state of North Carolina have conspired to take (at gunpoint) 36% of those earnings. Because the alternative way to generate revenue—when being nice doesn't work—is forcibly taking it with the support of (unjust) laws. So my $3000 looks conspicuously like $1920 by the time it reaches my pocket. Your results may vary.

How To Internationalize TinyMCE Plugins in WordPress Plugins

To internationalize a TinyMCE button/plugin within a WordPress plugin, you have to interface with the TinyMCE API as well as the normal methods for i18n in WordPress. I didn’t find much help in figuring it out, so I decided to document my findings.

For the purposes of this tutorial, we are working with my Better Click To Tweet WordPress Plugin, which adds a button to the visual editor for users to add a Tweetable Quote to their posts.

Swap out hard-coded strings in the .js file

In the original js file, I have 5 strings that are in need of being translated. Let’s look at the first one: the ToolTip (line 8 of the file). Instead of hard-coding ‘Better Click To Tweet Shortcode Generator’ as in the original js file, I need to substitute

editor.getLang( 'bctt.toolTip', 'Better Click To Tweet Shortcode Generator' ),

Which tells the machine “Find ‘bctt.toolTip’ within the list of translatable strings loaded in TinyMCE, and echo that here.”

The optional (included) second parameter in the getLang() function gives a default text to fall back to, in this case “if you can’t find anything, echo ‘Better Click To Tweet Shortcode Generator'”

Repeat that process for all translatable strings in the .js file, giving them unique names.

Put the translatable strings into the php

Now we’ve told it to translate them within the js file, but there are two problems we need to solve:

  1. Put the translatable strings in the php somewhere, so that our .po and .mo files can get to them to translate them.
  2. Add the translatable strings to TinyMCE.

To solve problem one, create a file to store the strings in. In our case, I made a file named bctt-mce-locale.php.

Here’s the content of that file:

$strings =
	'tinyMCE.addI18n( 
		"' . $mce_locale .'.bctt", 
			{
			toolTip : "' . esc_js( _x( 'Better Click To Tweet Shortcode Generator', 'Text that shows on mouseover for visual editor button', 'better-click-to-tweet' ) ) . '",
			windowTitle : "' . esc_js( _x( 'Better Click To Tweet Shortcode Generator', 'Text for title of the popup box when creating tweetable quote in the visual editor', 'better-click-to-tweet' ) ) . '",
			tweetableQuote : "' . esc_js( _x( 'Tweetable Quote', 'Text for label on input box on popup box in visual editor', 'better-click-to-tweet' ) ) . '",
			viaExplainer : "' . esc_js( _x( 'Add \"via @YourTwitterName\" to this tweet', 'Text explaining the checkbox on the visual editor', 'better-click-to-tweet' ) ) . '",
			viaPrompt : "' . esc_js( _x( 'Include "via"?', 'Checkbox label in visual editor', 'better-click-to-tweet' ) ) . '",
			} 
  		);
  	';

This file is using the tinyMCE function addI18n() and making an associative array containing the translatable strings. The _x() allows me to add an explanation as the second parameter, to give translators some context for where this text appears in the plugin.

Each new .mo/.po file included in the main plugin’s language folder adds a new mce locale thanks to the $mce_locale variable in the third line.

Load the strings into TinyMCE

Now we are almost there. Our strings can be translated by .po and .mo files, but they are still not being added as external languages to TinyMCE. Luckily, there’s a filter for that.

In the same file that registers the TinyMCE plugin, we need to hook into the filter at mce_external_languages with a function that returns the location of our new file. That looks like this:

public function tinymce_loader() {
add_filter( 'mce_external_languages', array( __class__, 'bctt_tinymce_languages' ) );
}

public static function bctt_tinymce_languages( $bctt_locales) {
    	$bctt_locales[ 'bctt' ] = plugin_dir_path( __FILE__ ) . '/languages/bctt-mce-locale.php';
  		return $bctt_locales;

That’s it! Make sure that the path to the newly created file is correct, and you are good to go!

I have disabled comments, but if you have comments or questions, the contact form below will get to me. Thanks!

How to Switch Plugins from Click to Tweet by CoSchedule to Better Click To Tweet

So I’ve convinced you that switching plugins from Click to Tweet by the folks over at TodayMade (the makers of the top-notch content marketing editorial calendar CoSchedule) is worth it. But what about all of those tweet quotes you’ve already added to dozens (if not hundreds) of blog posts?

Going back through to switch each quote manually is a huge headache at best, or a deal-breaker at worst.

This is a tutorial for how to do it in fewer than 10 minutes, with one plugin and a few clicks.


Warning: read carefully, and you should be fine. Skip ahead and you could irreparably (translation, I can’t fix it even if I wanted to) damage the database, and mess up everything.


The first thing you’ll need to do is download and configure the Better Click To Tweet plugin. The two plugins should peacefully coexist, so don’t uninstall the old plugin until the end of this tutorial.

Next, before you do anything on WordPress (especially related to the database) always take a full backup, stored on your local computer (or some cloud backup server). I trust you understand that backups are a non-negotiable must-have for anybody who wants to keep anything they’ve ever said on their website, so this is more fundamental than the scope of this tutorial.

There are several solutions out there for backups, the most respected being VaultPress (made by the folks over at Automattic, the step-parent of WordPress).

I have also used BackupBuddy from iThemes, and have heard great stuff about Migrate DB pro. I don’t care how you back everything up, just that you DO back everything up. (shameless plug: I offer that as a service) Also, it’s worth having a test site to make sure you know how to restore from that backup.

Please don’t skip this step, because I won’t be able to help you get back everything if you do something even just slightly wrong.

::climbs down off of soapbox::

Now, for a bit of a basic lesson on how WordPress works. The database stores all of the words on your site, including pages, posts, and other content. For our purposes today, we are looking to find every instance of the old Click To Tweet code that looks like this:

[Tweet "Some tweetable quote..."]

And replace it with our nice new Better Click To Tweet WordPress shortcode:

[bctt tweet="Some tweetable quote..."]

Note that all we need to replace is the beginning portion of the old pseudo-shortcode. Everything after (and including) the first quotation mark can remain unchanged.

To make that change, we need to do what is appropriately called a “search and replace” on the database. There are several plugins in the official WordPress.org repository that claim to be able to make the changes. The one I have used and recommend (despite the fact that it has the ominous WordPress warning “this plugin has not been tested with your version of WordPress”) is Search Regex.

Install the plugin, make sure you’ve gotten a full backup that you can confidently restore from, and configure the plugin like so (this page can be found under the “Tools” menu in your admin area):

You can't see it, but I did put the space in the first box after the word "Tweet." I don't know if it matters or not.
You can’t see it, but I did put the space in the first box after the word “Tweet.” I don’t know if it matters or not.

The first time around, click the replace button, and scroll down to see the proposed changes. If those look right (make sure that the spacing is correct in the new shortcodes!), scroll back to the top and click “Replace and Save.”

As they say in France, “Voila!” You have upgraded your Click To Tweet experience, and future-proofed your WordPress site!

You may now (after you verify that everything looks satisfactory on the front end of your site) safely deactivate and uninstall the Click to Tweet plugin by TodayMade.

If you run into any issues, restore from the backup I insisted you make above, start a thread on the support forums (so that everyone can benefit from our back-and-forth), and I will happily help you get switched over!

Welcome to the Better Click To Tweet family. Why not let others know how great it is:

I just switched to Better Click To Tweet with the help of this tutorial! Share on X