Posts tagged ‘WordPress’

Wordpress + WPTouch + WP-HashCash (update)

UPDATE: In a prior post I mentioned this blog uses Wordpress with the WPTouch plugin for great mobile device support (iPhone & Touch, Blackberry, Android, etc.) and the WP-Hashcash anti-spam plugin.

Things were not as "plug-and-play" as I would like. Well, with the 1.9.7.7 update to WPTouch, life is much happier.

Now, if you simply turn off AJAX comments in WPTouch, everything plays well together. No code changes required !

Thanks BraveNewCode ! … look for a little something in your beer fund :-)

Using Wordpress with WPTouch and WP-HashCash

If you use Wordpress you should definitely install the WPTouch plugin and give your readers a great experience for their mobile device (iPhone, Blackberry, Android, etc.) Additionally, I am fond of the WP-Hashcash anti-spam plugin since it works well and does not require posters to read one of those CAPTHA images.

Unfortunately, out of the box, things do not play well together. The symptom is that comments that come through the WPTouch experience, will be flagged by WP-Hashcash as potential spam because it did not get a value generated key. There are a lot of background that is not important. There are two ways to make things play well. One has minimal changes but does not support AJAX comments. The other is more invasive but retains all the functions of both plugins.

 

Minimalist Solution:

WP_Hashcash requires two things in the theme – some JavaScript to be inserted in the header and a hidden field inserted into the comment form. The plugin uses hooks for each of these so the theme only needs to conform to the following.

WP Hashcash relies on the presence of two hooks in your theme, wp_head and comment_form. If your theme doesn’t include these actions, you will need to add them immediately before the </head> and </form> tags respectively.

source: Elliot Back, author of WP-Hashcash

Things are a bit spread out. If you have already enabled your normal theme for WP-Hashcash, then the wp_head() change is already done since WPTouch adds to your normal header. However, WPTouch provides its own comments page so you will need to edit that. It’s location is:

  /public_html/blog/wp-content/plugins/wptouch/themes/default/comments.php 

Just add the following before the closing </form> tag:

  <?php do_action('comment_form', $post->ID); ?> 

There is one more thing. In the plugin settings page for WPTouch, you will need to turn off AJAX comments.

 

Full Function Solution:

You make the changes described above but you do not need to turn off AJAX comments. You then need to make some code changes to both WPTouch and WP-Hashcash.

Back in the same directory as WPTouch’s "comments.php" there is the partner file called "comments-ajax.php". Edit this file in two places – adding one line (seen below in bold green) and appending to another (seen below in bold blue).

  $comment_author = trim($_GET['author']); 
  $comment_author_email = trim($_GET['email']);  
  $comment_author_url = trim($_GET['url']); 
  $comment_content = trim($_GET['comment']); 
  $wphc_value = trim($_GET['wphc_value']); 
  ... 
  $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'user_ID', 'wphc_value'); 

Now edit the "wp-hashcash.php" file which should be in the root of your plugins directory. Near the very bottom of the file, there is a comment, "Check the wphc values against the last five keys". There are actually two instances of this comment and you will make changes for the one in the "wphc_check_hidden_tag()" function. The code only looks for the "wphc_value" field in the _POSTS data. If you are using WPTouch AJAX comments, the changes above have added this field to the compacted "comment data". Now you need to check both locations as follows:</P?

  $hash_value = $_POST["wphc_value"]; 
  if (!$hash_value) 
    $hash_value = $comment['wphc_value']; 
  $spam = !in_array($hash_value, $options['key']); 
   
  if($options['logging'] && $spam) 
    $comment['comment_content'] .= "\n\n[WORDPRESS HASHCASH] The poster sent us '".($hash_value)."' which is not a hashcash value."; 

Mobile-fy the web

IMG_0161

I’ve become one of those "smoker bigots" – you know the kind … they quit smoking and *THEN* start preaching all the bad things that smoking does. My conversion was not that I was a smoker; it was the "mobile browser".

I am blogger and user of the web but until about 6 months ago I was mostly on my computer. I now read blogs, feeds, news, and more using my iPod and/or my Blackberry. I use if for Facebook, the weather, Twitter (a little), and most of my personal email. I realized my blog was not as friendly to these mobile devices as it could / should / and eventually would be.

So, I set about to add support for mobile devices and mobile users. It was easy for my blog since it uses Wordpress and there is the WPTouch plug-in that makes it nearly automatic. It added support for the devcies I use most often and I even added support for the Androids of the world. (If you have a mobile device and it is not working with my blog, add a comment and I’ll do my best).

So, now I grumble whenever I hit a website that *does not* have special support for mobile devices. I realize I am being zealous but that has not stopped me from small internal unseen spurts of frustration. Oh well. I guess I could seek counseling.

How many times will you do the same thing ?

wordpress-facebook Blogging, tweets, Facebook walls …. it can all be too much. For me it can all be too redundant. Like Ramírez said, "in the end, there can be only one".

I’ve been running a bit of a social experiment on myself over the past few weeks. anyone who reads this blog has noticed I have not been as prolific as I usually strive to be. It is partly because I’ve been in an experiment on Facebook. All that is wrapping up now. I have decided I can’t be master/mistress to two slaves …. wait, strike that and reverse it.

My preferred outlet is blogging. I like the longer for it promotes and I like the combining of words and pictures. However, blogging as more of a "broadcast" and Facebook allows me to listen to others. So, I have gathered so twine, bailing wire, and glue. I will blog for most of my content and "listen" and comment over on Facebook. I hope this keeps most of my efforts singular. time will tell.

… and for the record, I once again spent way too much time creating the artwork for this post.

Automating parts of a multi-user blog

I manage a "topic blog" for work. For the uninitiated, a "topic blog" has posts from a community of interest on a given topic. Often, topic blogs have lots of contributors. That’s the case for Communicat.us. Managing lots of users requires some tools and some automation.

Today’s tasks included adding 15 new users, sending out the "getting started" guide to everyone, and updating the "authors" page. To make the least work of it all, I added a Dragon Design’s Import Users plug-in for Wordpress. That made shore order of adding the 15 new users. But, before I did the upload, I found out how to modify the email that get’s sent for each new user.

Wordpress supports "pluggable functions". Fortunately for me, the wp_new_user_notification() function is one of those. Steve Taylor got me started with his basic code for extending the email that gets sent out. Here is what I ended up with …

<?php
/*
Plugin Name: Custom New User Email
Description: Changes the copy in the email sent out to new users
*/

// Redefine user notification function
if ( !function_exists(‘wp_new_user_notification’) ) {
    function wp_new_user_notification( $user_id, $plaintext_pass = ” ) {
        $user = new WP_User($user_id);

        $user_login = stripslashes($user->user_login);
        $user_email = stripslashes($user->user_email);

        $message  = "New user registration for " . get_option(‘blogname’) . ":\r\n\r\n";
        $message .= "Username: " . $user_login . "\r\n";
        $message .= "E-mail:   " . $user_email . "\r\n";

        @wp_mail(get_option(‘admin_email’), get_option(‘blogname’)." – New User Registration", $message);

        if ( empty($plaintext_pass) )
            return;

        $message .= "\r\n\r\n";
        $message .= "To log in:\r\n";
        $message .= wp_login_url() . "\r\n";
        $message .= "Username: " . $user_login . "\r\n";
        $message .= "Password: " . $plaintext_pass . "\r\n\r\n";

        $message .= "You will find the \"getting started\" guide at: ".get_option(‘upload_url_path’)."/getting_started.pdf"."\r\n";

        wp_mail($user_email, "You have been added to " .  get_option(‘blogname’), $message);

    }
}

?>

… Feel free to copy this into a file called "new_user_email.php", upload it to your plugins directory and activate it. Don’t forget to also upload your getting_started.pdf to your upload directory and double check you have set the upload path under Administration >> Settings >> Miscellaneous

Everything was working well but then I noticed the automated "Authors" page was full of the new users with no photos, "nice names" or biographies. The page is generated using an "authors.php" file added to the theme. The problem is that is shows all registered authors. What would be better is if it only showed authors who had actually contributed to the blog. So, I set about to some good ol’ trial and error with "SELECT", "COUNT", "WHERE", "GROUP BY", and "ORDER BY" … aka SQL code. Here is a snippet of the final results …

<table border=0>
<?php
    // Get the authors from the database ordered by user nicename, but only include those with posts
    global $wpdb;
    $query = "SELECT wusers.ID as ID, wusers.user_nicename as user_nicename, COUNT(wposts.post_author) as thecount ";
    $query .= "FROM $wpdb->users wusers, $wpdb->posts wposts ";
    $query .= "WHERE wposts.post_status = ‘publish’ AND wposts.post_type = ‘post’ AND wposts.post_author = wusers.ID ";
    $query .= "GROUP BY wusers.ID ORDER BY wusers.user_nicename";
    $author_ids = $wpdb->get_results($query);

    // Loop through each author
    foreach($author_ids as $author) :
        // Get user data
        $curauth = get_userdata($author->ID);
        // If user level is above 0 or login name is not called "admin", display profile
        if($curauth->user_level > 0 || $curauth->user_login != ‘admin’) :
?>
        <tr><td>
            // show the user profile
            <?php echo (profilepic_internal_profile($author->ID)); ?>
            // show how many posts they have and give a link to posts
            <a href="/index.php?author=<?php echo $author->ID; ?>"><i><?php echo "View " . $curauth->first_name . "’s " . $author->thecount . " post(s)"; ?></i></a>
        </td></tr>
<?php
        endif;
    endforeach;
?>
</table>

So, now I can add new users quickly. New users get the same information to start blogging (both some guides on what is a good blog post as well as the tools they can use to write their posts. Once a users starts to contribute, they will automatically appear on the page of authors.

It was all pretty easy. If you manage a multi-user blog, feel free to use these techniques and take the above code.