I’m writing a plugin that takes an xml feed and posts it into WordPress using wp-cron
Everything is working dandy, except it keeps adding the same posts over again.
So, I’m working on a system to check to see if a post of that title already exists.
I’ve written this, but its always returning ‘already exists’
global $wpdb;
$query = $wpdb->prepare('SELECT ID FROM ' . $wpdb->posts . ' WHERE post_title = %s', $article->heading);
$wpdb->query( $query );
if ( $wpdb->num_rows ) {
error_log('already exists');
} else {
wp_insert_post($post, $wp_error);
}
I’m fairly new to working with the database side of WordPress and I saw the $wpdb
when googling for help. Now, I haven’t defined this anywhere but the place I was reading seemed to suggest it was built in.
All help appreciated!
Thanks
Yes
$wpdb
is built in and is loaded by the WordPress Core on every page load.I don’t see any critical problem with your code. I am going to suggest some improvements because I see some places where could go wrong, but mostly that should work. That makes me think that
$article->heading
is not matching up to the insertedpost_title
. So…Try to normalize your title with
sanitize_title_with_dashes
which is how WordPress builds the post slug, and then check for that slug instead.Now your query is looking for
post_name
, which is the slug or permalink tail, and I changed$wpdb->query
to$wpdb->get_var
since you are looking for a single variable, which we save to$cID
.Use a better check for your conditional.
if ( !empty($cID) ) {
However, this might not be the right approach at all. Look into the XML_RPC API mentioned by @kaiser. It has post insertion capabilities.
https://developer.wordpress.org/reference/functions/post_exists/