After my adventures with Google telling me I was hosting adult content (again, this is actually my third go-round with them), I’m here to inform you that you can now block Google Ads on one page only.
Add a URL Channel
First you have to tell Google what your URLs are that you want to treat differently. For that, we’ll use a URL channel which you can find at My Ads > Content > URL Channels. Now, you only get 500 of these, which means you can only flag 500 unique URLs as … well … unique.
You may notice, no wildcards. So I can add halfelf.org/2012/legitimate-porn-plugins/ but not halfelf.org/.*/.*[porn].*/ which would be pretty cool. Once you’ve added your URL, you’ll see it like this:
Edit Ad Settings
I’m using Auto Ads because I’m incurably lazy, as my friend Syed knows. So I go to My Ads > Auto Ads, but if you were using specific units, you’d go to My Ads > Ad Units. There you go to the Advanced URL Settings section and click on the add button for a new URL Group.
This brings you to a page where you can select the URLs for this group.
When you’ve picked all your URLs (and yes you can add more later), click next and you’ll get a list of all the possible ad units. Uncheck them all. That’s the point of this, right? Finally you’ll review the group and give it a name. I picked “No Ads” since that’s what this was.
In July of 2018, I was informed by Google Adsense that specific content on my site was going to have “restricted ad serving” and I needed to go to the policy centre on Adsense to find out why. There was no link to this centre, by the way, and it took me a while to figure out I went to Adsense > Settings > Policy where I saw this:
Yes, that image says that the post about Legitimate Porn Plugins was deemed to be sexual content. My guess is that they don’t like the image, because my post about how GPL says Porn is Okay did not get flagged.
My friend pointed out that it was ridiculously damaging to moderate content (or at least in this case, revenue) by “casting a wide net based solely on the presence of key words” and she’s quite right. Now I did attempt to get Google to reconsider, but like my past experiences with their censorship and draconian view, they don’t give a damn if you aren’t ‘big.’ And even then, important people get slapped by Google all the time.
History? What History?
In 1964, there was a landmark case in the US, Jacobellis vs Ohio, about whether the state of Ohio could, consistent with the First Amendment, ban the showing of the Louis Malle film The Lovers (Les Amants), which the state had deemed obscene. During that case, and the reason it became so well known, was not the content matter.
In fact, the decision remained quite fragmented until 1973 Miller v. California decision in which it was declared that to be smut (i.e. obscene) it must be utterly without redeeming social importance. The SLAPS test addresses this with a check for “serious literary, artistic, political, or scientific value” – and yes, the acronym is hilarious.
No, everyone knows about the first case because of the following quote by Justice Potter Stewart:
I shall not today attempt further to define the kinds of material I understand to be embraced within that shorthand description; and perhaps I could never succeed in intelligibly doing so. But I know it when I see it, and the motion picture involved in this case is not that.
Tea, Earl Grey, Hot
When I was very young, maybe six, my father did a talk about artificial intelligence with a slide of Captain Kirk ordering things from the ship’s computer. It stuck with me, which Dad finds amusing, and I’ve often reflected back on it as an understanding of what an AI can and cannot do.
The ship’s computer on Star Trek can do a great many things, but it cannot make ‘decisions’ for a person. In the end, a human always has to decide what to do with the variables, what they mean, and how they should be used. Kirk has to ask the computer to chill the wine, for example, and if he doesn’t specify a temperature, the computer will go back to what some other human (or more likely Mr. Spock) has determined is the optimal temperature.
AIs don’t exist. Even as useful as I find digital assistants like Siri and Alexa, I know they aren’t intelligent and they cannot make decisions. They can follow complex if/then/else patterns, but they lack the ability to make innovation. What happens if Kirk just asks for ‘white wine, chilled’? What vintage will he receive? What temperature?
To a degree, this is addressed with how Captain Picard orders his tea. “Tea, Earl Grey, hot.” But someone had to teach the system what ‘hot’ meant and what it meant to Jean-Luc and not Riker, who probably never drank any tea. Still, Picard has learned to specify that he wants Earl Grey tea, and he wants it hot. There’s probably some poor tech boffin in the belly of Starfleet who had to enter the optimum temperatures for each type of tea. Certainly my electric kettle has a button for ‘black tea’ but it also tells me that’s 174 degrees Fahrenheit.
Automation Limitations
My end result with Google was that I had to set up that specific page to not show ads. Ever. Because Google refused to get a human to take a look and go “Oh, its the image, remove that and you’re fine.” But even then a human could look at the image, recognize it’s not pornography, and flag it as clean.
What we have is a limitation in the system, where in there is no human checking, which results in me getting annoyed, and Google being a monolithic annoyance. Basically, Google has automated the system to their specifications, and then instead of putting humans on the front lines to validate, they let it go.
This makes sense from a business perspective, if you’re as big as Google at least. It costs less. But we’ve all read stories about people getting locked out of their Google accounts, for a month or more, and facing drama because there’s no way to get in touch with a human being.
The Heart of It All is Humans
And that’s really the heart of the problem.
Have you ever visited a forum or a chat site and it’s full of people acting like decent people to each other? Humans did that. A human sat down, purged the site of the vile content, and had to sit and read it to be sure. They pushed back on trolls and other problematic people, all to help you.
Don’t believe me? Okay, do you remember the WordPress plugin WangGuard by José Conti? He shut the service down in 2017 because it was giving him a mental break down. The plugin worked so well because he, a human being, evaluated content.
WangGuard worked in two different ways, one an algorithm that had been perfecting for 7 years, and that was perfecting as the sploggers evolved, so it was always ahead of them. And a second part that was human, in which I reviewed many things, and among them sploggers websites to see their content, improve the algorithm and make sure that it worked correctly both when a site was blocked and not it was. The great secret of WangGuard, was this second part, without this second part, WangGuard would not have become what it was.
This is something I’ve wanted for a long time. I opened a ticket with cPanel about it yonks ago as Ceph storage is offered by more than just Amazon, and yet cPanel was making it super hard to use for backups.
Well in the next release of cPanel, this will no longer be the case! If you’re on version 74 (which is in release stage, but not current, so most people do not have it yet) you can do this.
Add A New Backup Option
Go to Home > Backups and open up the settings.
In there, you can add a new Backup option. Pick S3 Compatible:
Configure for DreamObjects
Now just throw in the right data:
You’ll want to use objects-us-east1.dream.io for the endpoint, and then your bucket and keys.
If you have an iPhone, it’s annoying hard to record phone conversations these days. In Apple’s defence, that would be because it’s illegal to record someone without their consent in many places and, let’s face it, expecting users to know what the law is everywhere is pretty unlikely.
Still, I had the case where I needed to record someone’s phone conversation, with their consent, for an article I was working on. And while I thought of a bunch of solutions like Audacity and Skype, I hit a wall when they said they could only use the phone.
Well now it’s on to a hardware solution.
What You Need
The basic solution is to connect your phone to an external recording device. This is not exactly simple, as it isn’t ‘just’ plugging your phone into a recorder and pressing go. To do this with an iPhone you need:
an iPhone/headphone adapter – I recommend one that allows you to use a power adapter while you’re on the phone. In case the call goes long.
a decent XLR microphone – I prefer a lav mic (the kind you clip on) but if you want a handheld, go for it.
headphones – You probably have these already. The regular 3.5mm ones.
a recorder like a Zoom H4n or a Tascam DR-40 – It must have at least four input channels. The ones that have ‘two’ channels don’t allow you to plug in the phone or mic.
There’s no software needed here, because that recorder saves to an SD card, so you’re going to be able to use that directly. I do recommend a power adapter for your recorder, as the XLR mic will be using power from the recorder and you don’t want it crapping out.
Putting it Together
The connection method (which you can see on my setup above) is as follows:
headphones in so I can hear everything
lav mic so people can hear me
1/4″ to 3.5mm adapter
3.5mm male/male cord
3.5mm to iPhone adapter
When someone calls, I answer, make sure they’re okay with being recorded, and off I go.
Gotchas
There are a couple things to keep an eye on that will trip you up.
First of all, you must use a mono cable from your phone to the recorder. Stereo will make a weird buzzing sound.
Next, I recommend plugging in everything (including the recorder) because the XLR mic uses phantom power.
Make sure you set up your recorder to use input 1/2 as your input. By default, mine is set to ‘mic’ which is the two channel microphone on the top of the recorder. Using that won’t do you any good at all.
And finally? Even if you live in a one-side-consent state (all US states except 12 have this, which includes my current of California so yes, I have to ask for consent first), please please please remember to ask the person before you press record.
With WordPress 5.0 getting closer and closer, I know a lot of people are worried about Gutenberg and what that will mean for their themes and plugins.
Most Themes Will Be Fine
The majority of themes, every single one you can download from WordPress.org, and the ones from reputable theme shops like StudioPress, will be just fine. Nothing will break, and other than getting a new editor experience, there’s no change.
What will happen, and yes people will call this breaking, is that not all features will be supported.
Right now, most themes don’t support some of the more outré block types. And a lot of themes don’t support text columns like this:
And then again, Genesis? Does!
This is a left column
This is a right column
And every theme is going to support repeatable blocks which means you’ll be able to build out some nice defaults and standards.
The reason for all this is that if you’re just using Gutenberg as an editor, not a whole lot has changed with your content. It remains the same as it ever was, just with a fresh coat of paint.
There are exceptions, like themes that rely heavily on features that alter the post editor. I’ll get there in a minute.
Most Plugins Will be Fine, Too
Here again, unless your plugin interest with the post editor, you are going to be just fine. You use Jetpack to publicize your posts? Cool. No change. AMP? No change. Go look at most of your plugins. Caching? No changes. Google Analytics? No change.
The reason here is, again, most plugins don’t mess with post editing. I should know. I review them.
I know what you’re thinking, though. What about plugins like Yoast SEO, which add in a bunch of extra boxes at the bottom and sides of a post? The boxes are called Meta Boxes, and they’re already supported. Plus Yoast went to the extra effort of being on the forefront of Gutenberging.
The colours to indicate how good your post’s SEO is, however, are missing right now. So is the field to customize your Jetpack publicize content. Basically everything that went on that sidebar on the post edit screen (the Publish Box) isn’t done yet.
Which brings me to…
The Exceptions Will Hurt
Okay. I won’t sugar coat this. If you use a complex post editor, like Visual Composer or Bold Grid, or if you use a plugin with a lot of custom meta boxes, the world will be very different, and probably unhappy.
Now that said, Visual Composer will work with Gutenberg! And so will ACF and CMB2 is well on it’s way. But. The problem is people who have bundled those plugins in their themes. And those themes will have to update their packages and make sure users update.
Anyone who just had a mental image of how many premium themes bundle Visual Composer and tried to calculate the number of users who don’t properly update themes regularly… welcome to my world. I’d like to say I’m ‘against’ the bundle, but the reality is that I’m against premium products using libraries and then not managing those libraries properly. Not that it’s easy, and that’s a different topic.
The problem in the exception is that there will be a non-insignificant number of people who have no idea they’re using a problematic library that needs an update.
Where Do We Go From Here?
This problem is WordPress’ own doing, make no mistake. If the ability to add custom meta boxes and settings and the like was less complicated to begin with, we wouldn’t have needed tools like these to work around it. We still have no decent meta box API, and the settings API is something I regularly call “as intelligent as a bag of wet hair.”
But. Innovation is necessary. We can’t just not move forward because we didn’t do things right the first time. And in WordPress’ defence, there was no way to know or even write the ‘right’ way back 15 years ago when all this started. The best tools didn’t exist. And all those ways we built to hack around the problem made it more clear what the right way needed to be.
Which brings us here.
Most of what you do won’t be impacted by Gutenberg. What is adversely impacted won’t break most things, but it will be really annoying. And then those rare edge case exceptions? Well. We’re back to the words (paraphrased) of Hecht.
When infrequently used systems break, they do so in big ways.
So maybe you read my post about hash tagging Jetpack Publisher posts with a complex check of “Is this tag also a custom post type?” and you thought “Mika, that’s awesome. But I don’t have a database of shows!”
To my reporter friend who lamented this to me, I have a solution.
The Real Problem
I think most of the problem with Jetpack’s custom Publicize message is that it’s (rightly) hidden by default. Most people don’t need it. But those that do want to see it so we remember “and do this…”
And let’s be honest, this visibility issue is going to be worse when we move to Gutenberg.
Again, I don’t think Jetpack is in the wrong here. The majority of users don’t need to be so aggro about their messages. There are a lot of WordPress sites that we would classify as ‘smaller’ sites. And those who aren’t tend to need very bespoke/custom solutions, which is the problem.
My solution works for me because it’s easily automated and checkable. We’re very pedantic about tags (seriously, Tracy went through all our tags and cleaned them up), we have a great system to match tag to show, and, most significantly, we know that our social media engagement relies on not just content, but the appropriate hashtags. That is, the shows we’re talking about.
This means there are two types of ways to do this:
1) Make all your tags (and/or categories) into your hashtags
2) Make a custom taxonomy for your hashtags
Since using all the tags might be a bit much, I went with option 2.
The Code
<?php
/*
* Jetpack tweaks
* @version 1.0
* @package mu-plugins
*/
class HalfElf_Jetpack {
public function __construct() {
add_action( 'publish_post', array( $this, 'custom_message_save' ) );
add_action( 'init', array( $this, 'register_taxonomy_hashtag' ) );
}
public function register_taxonomy_hashtag() {
//parameters for the new taxonomy
$arguments = array(
'label' => 'Hashtags',
'hierarchical' => false,
'public' => false,
'show_ui' => true,
'update_count_callback' => '_update_post_term_count',
'rewrite' => false,
);
register_taxonomy( 'flf_hashtags', 'post', $arguments );
}
public function publicize_hashtags() {
$post = get_post();
$hash_tags = '';
// If the post isn't empty AND it's a post (not a page etc), let's go!
if ( ! empty( $post ) && 'post' === get_post_type( $post->ID ) ) {
update_post_meta( $post->ID, '_wpas_mess', 'test' );
// First let's add the hashtags
$post_tags = get_the_terms( $post->ID, 'flf_hashtags' );
if ( ! empty( $post_tags ) ) {
// Create list of tags with hashtags in front of them
foreach ( $post_tags as $tag ) {
// Change tag from this-name to thisname and slap a hashtag on it.
$tag_name = str_replace( '-', '', $tag->slug );
$hash_tags .= ' #' . $tag_name;
}
}
// Next we add a category in specific situations.
$post_cats = get_the_category( $post->ID );
if ( ! empty( $post_cats ) ) {
// Create list of tags with hashtags in front of them
foreach ( $post_cats as $cat ) {
if ( 'MAINCAT' === $cat->slug ) {
// Change slug from this-name to thisname and slap a hashtag on it.
$cat_name = str_replace( '-', '', $cat->slug );
$hash_tags .= ' #' . $cat_name;
}
}
}
}
// Loop back. If there are hashtags, we add them.
if ( '' !== $hash_tags ) {
// Create our custom message
$custom_message = 'New post! ' . get_the_title() . $hash_tags;
update_post_meta( $post->ID, '_wpas_mess', $custom_message );
}
}
// Save that message
public function custom_message_save() {
add_action( 'save_post', array( $this, 'publicize_hashtags' ) );
}
}
new HalfElf_Jetpack();
A Little Explanation
You may notice I added in a bit that looks for a specific category:
if ( 'MAINCAT' === $cat->slug ) { ... }
The reason here is that on the specific site I wrote this for, they have four (yes four!) categories:
1) Announcements
2) News
3) Fandom (actually named FOR the fandom)
4) Miscellaneous
They wanted item #3 to be a tag, so it would always #JanelleMonae (for example). For them I did a super basic ‘if the fandom, then the hashtag’ but a slightly more common situation would be someone having a category for ‘Fandoms’ and then subcategories our fandom. For that you’ll want something like this:
foreach ( $post_cats as $cat ) {
$cat_mom = $cat->category_parent;
if( $cat_mom > 0 && 'fandoms' === $cat_mom->slug ) {
// Change slug from this-name to thisname and slap a hashtag on it.
$cat_name = str_replace( '-', '', $cat->slug );
$hash_tags .= ' #' . $cat_name;
}
}
Enjoy your hash tagging!
We use cookies to personalize content and ads, to provide social media features, and to analyze our traffic. We also share information about your use of our site with our social media, advertising, and analytics partners.