Exclude SlideDeck posts in WordPress

Tags: , , , ,

On a WordPress site I’ve been working on I’m using SlideDeck as a feature article slider on the homepage.  The only problem was I have additional articles populating underneath it and the articles from the SlideDeck were showing up down there as well.

We didn’t want that behavior so I researched how to filter out SlideDeck posts from the post loop.  At this time, it’s apparently easy to filter for content that has a custom meta-tag, but you can’t easily filter for content that doesn’t have a custom meta-tag applied to it.  It’s because when a post doesn’t have a custom met-tag attached to it that custom meta-tag doesn’t come up as “null” or “0”  it simply doesn’t come up at all.  So there’s no way to use query_posts to filter out SlideDeck posts, you have to make custom database query and use $wpdb->get_results.

This post from SlideDeck’s customer support website did most of the heavy lifting for me in putting together the exact query I needed to filter out only SlideDeck posts.  The only problem was that this gave me no insight as to how I could paginate the posts.  Thankfully google came to rescue once again and I found this post and this post which helped me piece together the script.  I posted my findings on SlideDeck’s customer service website, but I’m posted it here as well so I can easily find it again if I need it.

So for the code, inside loop.php before have_posts() I put…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(is_home()) {
    //query_posts(array( 'meta_key' => 'slidedeck_post_featured') );
    global $wpdb;
    $ppp = intval(get_query_var('posts_per_page'));
 
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $offset = ($paged-1) * $ppp;
    $sql = "SELECT p.*
        FROM {$wpdb->posts} AS p
        LEFT JOIN {$wpdb->postmeta} AS pm
        ON pm.post_id = p.ID AND pm.meta_key = %s
        WHERE p.post_status = %s AND p.post_type = %s AND pm.meta_value IS NULL
	ORDER BY p.post_date desc
        LIMIT $offset, $ppp";
    $posts = $wpdb->get_results($wpdb->prepare( $sql, '_slidedeck_post_featured', 'publish', 'post' ));
}

if(is_home())  will make it so it will only filter out SlideDeck posts on the homepage, and apparently the have_posts() works exactly as it normally does even when I change the loop using $wpdb->get_results, which means I don’t have to do much to the rest of the page in order for this to work.  WordPress, you rock <3

This will paginate the posts according to the number of items I have set in the WordPress settings, but for some reason when I did this on the last page it printed out empty posts to fill out that page.

For instance, say I only have 7 posts left on the last page, but I have it set to show a maximum of 10 posts per page – it would print out 3 empty posts on that page.

To combat this I put the following code inside have_posts() so it wouldn’t print anything if the post ID was null.

1
2
3
if(get_the_ID() > 0) {
    //html for posts
}

Pretty straight forward and everything has been working great so far :)

 

References

http://support.slidedeck.com/slidedeck/topics/wp_query_a_list_of_posts_not_featured_in_the_slide_deck?from_gsfn=true

http://wordpress.org/support/topic/custom-loop-pagination

http://www.scriptygoddess.com/archives/2011/02/23/wordpress-pagination-woes-solved-i-hope/

Permalink » No comments

Spamlists and WordPress

Tags: , , , ,

I’ve been getting dozens of e-mails with spam posts to this blog and it’s become far to annoying to ignore any further!  I’ve been using WordPress’s integrated blacklist tool, but it’s time consuming to maintain and only protects against past threats.  I took a look at the database and I’ve managed to collect over 3,000 spam comments that take up more than 20 mbs of database space…which is quite a lot IMO.

In the past the best prevention I’ve found against spammers is to use spam lists.  One I like in particular is FSpamlist.com.  You have to sign-up to get an API key, but after that using it is very straight forward.   Stop Forum Spam is a big one too, you don’t need an API key to check for spammers so it was even easier to add.  I put a simple WordPress plugin together to integrate the lists with my blog.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
/*
Plugin Name: Spamlist
Plugin URI: http://wannabe.contropa.com/fspamlist-and-wordpress/351/
Description: Uses spamlists to stop spammers
Version: 1.0
Author: Foxumon
Author URI: http://www.contropa.com
License: GPL2
*/
 
add_action('wp_blacklist_check', 'spamlist', 10 , 6);
 
function spamlist($author, $email, $url, $comment, $user_ip, $user_agent) {
    $username = $author;
    $email = $email;
    //$ip = $user_ip;
    
    $fspamcheck = file_get_contents('http://www.fspamlist.com/xml.php?key=######&spammer='.$email.','.$username.','.$ip);
    if (strpos($fspamcheck, '<isspammer>true</isspammer>') !== FALSE) {
        wp_die('Your e-mail address has been marked as spam.  You may request that it be removed here: http://www.temerc.com/forums/viewforum.php?f=72','spam');
    }
    
    $fspamcheck = file_get_contents('http://www.stopforumspam.com/api?email='.$email.'&username='.$username);
    if (strpos($fspamcheck, '<appears>yes</appears>') !== FALSE) {
        wp_die('Your e-mail address has been marked as spam.  You may request that it be removed here: http://stopforumspam.com/removal','spam');
    }
}
?>

I’m currently not planning on submitting it to the WordPress plugins directory or anything like that, but you want to try it out too you just save the code as “spamlist.php” add it to a “spamlist” folder in your plug-ins directory and then it ought to show up in your admin where you can active it.

It’s currently not set to report the spam that it blocks in any way…I’m not sure if I want it to or not.  I’m currently looking at over 3k of spam comments that are just sitting around taking up room in my database, but at the same time I don’t want to get any legitimate posters blocked without anyway of knowing.  Anyways, I’m going to test it out for now and see how it goes :)

Permalink » No comments