WPML and OptimizePress

WPML and OptimizePress can play decently together, but it requires a few under the hood tweaks in their respective admins.

The connection is far from ideal as you’ll be manually editing pages instead of using the built in translation management tools of WPML. This is because OptimizePress stores all of it’s pretty content in base64 encoded JSON encoded post meta data, so… WPML can’t provide easy access to the content.

OptimizePress Live Editor with WPML

After installing WPML, you’ll find that your OptimizePress Live Editor stops working just showing the loading spinner until you close out. If you check the console in your browser, you’ll see a handful of Javascript errors. This is not good.

Fortunately, the savvy folks at OptimizePress allow you to disable plugins in the LiveEditor, so:

  1. Log into your WordPress admin and head on over to Support under OptimizePress
  2. Scroll down to Disable for back-end (Live Editor)
  3. Check the JS and CSS boxes for any of the WPML plugins
  4. Click Save Settings

Now WPML won’t wreck OptimizePress’ Live Editor.

Copying Pages for Translation

Copying the page from the editor or from the translation tools didn’t work for me.

Things I tried that did not work:

  • Checking the Copy OptimizePress Content box
  • Clicking the Copy content from English button
  • Clicking the Overwrite with English content button
  • Setting all the OptimizePress meta fields to be added when a post was copied for translation
  • Marking a copied version of the page for Independent Translation

The only way I was able to successfully copy the OptimizePress page so that the translation would work, too, was from OptimizePress’ Clone Page.

  1. From your page/post listings, click Clone Page/Post
  2. Change the language of your new post on the WPML widget and confirm the popup
  3. Click the Connect with translations link, choose your page, and confirm the popup by clicking Assign
  4. Rename your page, adjust the slug, change it’s status, etc… and click Save
  5. Click the OptimizePress Live Editor button to edit your translated page.

Translation Links

Lastly, if you have the option turned on to show links to your posts in other languages, OptimizePress and WPML end up showing repeat links to other versions after every OptimizePress widget on your page which is undesirable. Disable this from the WPML Language Settings by unchecking the box next to “Show post translation links.”

Fireside Quesadillas

One of my favorite car camping, backpacking, and mountaineering meals is fireside quesadillas. This is usually good for the first night unless you’re in a cold enough area to keep food frozen or chilled (winter or high altitude climbing) or you have a cooler (car camping, canoeing, etc).

If you have a fire and a grill, you can cook these over the fire. Otherwise use a pan. Even a tiny backpacking frying pan does the trick, you just need to fold ’em to cook all parts. Continue reading “Fireside Quesadillas”

Yukon River by Canoe: Route, Outfitters, Planning, Logistics, and More!

We just returned from an incredible 8 days and 304km on the Yukon River leaving out of Whitehorse and finishing up in Carmacks.

It was an incredible journey through the Yukon that included wildlife, sunsets after 10pm, Northern Lights, sinking a canoe in whitecaps, exploring marooned riverboats, discovering abandoned woodcutting camps, finding old gold dredger parts, and amazing food. Continue reading “Yukon River by Canoe: Route, Outfitters, Planning, Logistics, and More!”

Hiking Volcan Cerro de Oro, Lake Atitlan, Guatamala

On the northern foot of Volcán Tolimán is a lesser climbed lava dome, Cerro de Oro (“Hill of Gold”). The hike and summit provide gorgeous views of Lago Atitlan, Volcán Tolimán, Volcán San Pedro, and Volcán Atitlán.

And… we discovered a Mayan ceremonial site along the way, and some ancient Mayan stone statues at the summit.

The most popular volcano to climb is San Pedro, but that requires a good 5am departure and a full day to climb. Atitlan and Toliman are even more difficult to get to, require more logistics, and take a full day plus to climb. Continue reading “Hiking Volcan Cerro de Oro, Lake Atitlan, Guatamala”

Disabling Controls on a Brightcove Video

At last, we figured out how to disable the playback controls on a Brightcove video. It was far from easy to figure out, but it IS possible to do in a few simple steps.

Why Disable Playback Controls?

Why would you want to turn off the play/pause options on a video and disable the scrubber at the bottom?

Well in my case, we often put up sales pages online and a) don’t want folks skipping to the end of the video and b) have tightly controlled timing of things like when the Add to Cart button pops up.

With other players (JW Player, FlowPlayer, EZS3, Easy Video Player and MORE) you can easily disable the controls. Continue reading “Disabling Controls on a Brightcove Video”

Unmerging Two Contacts on Android

AndroidOne day, I went to email a contact on my Android tablet, and as I started to type his email address, a different name came up. Oddly, I noticed that all of Chris’ email addresses were now showing up under Leo’s name (along with Leo’s email addresses).

Additionally, in the Google Voice call log and text history on my tablet, any calls or texts with Chris showed up as calls/texts with Leo.

This was not expected. In Gmail on the web, and in Gmail on my Android phone, both contacts were still distinct, but not on my tablet; they were merged together somehow… Continue reading “Unmerging Two Contacts on Android”

Google Docs – How to Find Documents Shared With Someone

Google DocsIn the old version of Google Docs, you could search for documents shared with someone. In the new version you can not. After much searching, I finally found a list of search codes you can use to search Google Docs and voila, you can indeed search for documents shared with people by using the “to:” prefix, i.e. to:bob@somewhere.com. Continue reading “Google Docs – How to Find Documents Shared With Someone”

Integrating Infusionsoft Links with WordPress

Wouldn’t it be cool if your landing pages that Infusionsoft tracking links and web form thank you page redirects go to could be personalized?

Until now, there wasn’t a WordPress plugin that let you do such a thing.

Infusionsoft allows you to create tracking links and include customer information such as their name and email address in the query string of the URL. Infusionsoft also allows your web forms to redirect to a thank you page on your site and include the web form data in the redirect link.

The challenge is that WordPress sites can SEE this data at the end of the URL , but can’t DO anything with it. So I wrote a plugin that can. Continue reading “Integrating Infusionsoft Links with WordPress”

Migrating from Movable Type to WordPress

Switching your blog from Moivable Type to WordPress can be a real challenge, especially if your URL structure has changed.

In my case, our blog posts were previously /blog/year/month/post_name_with_underscores.html and under WordPress were going to be simply /post-with-hyphens/

While there are many a fancy regex one can setup in their .htaccess file for 301 redirects, they often involve looping through a recursive regex to replace each individual underscore with a hypen, and then other regexes to do the rest of the work before finally redirecting.

There had to be a better way… Continue reading “Migrating from Movable Type to WordPress”

ClickBank Instant Notification Service in Perl

ClickBank is generous to provide code examples for many implementations of their Instant Notification Service, but… they don’t include Perl for some reason.

Here’s my Perl implementation.

use CGI;
use Digest::SHA1 qw(sha1_hex);
use Encode;

$q = new CGI;

sub ipnVerification() {
  my $secretkey = 'YOUR SECRET KEY';
  my $pop = "";

  foreach $field (sort($q->param))
   unless ($field eq "cverify") {
      $pop .=  $q->param($field) . "|";
  $pop .= $secretkey;
  my $calcedVerify = sha1_hex(encode("utf8", $pop));
  $calcedVerify = uc(substr($calcedVerify,0,8));
  return ($calcedVerify eq $q->param("cverify"));