Transients are probably not the way to go here.
From what I understand:
-
You want to know if a post has a shortcode by doing some form of look up
-
You want to be able to get a list of permalinks / posts that have this shortcode.
Here’s what I suggest.
/**
* Checks for calender shortcode and flags the post with post meta.
* @param integer $post_id
* @return integer
*/
function save_calender_postmeta($post_id)
{
// Make sure this isn't an autosave.
if(!defined('DOING_AUTOSAVE') || !DOING_AUTOSAVE){
// Get Post Content
$content = get_post_field('post_content', $post_id);
// Check for shortcode
if(has_shortcode($content, 'class-schedule')) {
// Update (or it will insert) the 'has_calender' post meta.
update_post_meta($post_id, 'has_calender', '1');
}
else {
// Delete the has calender post meta if it exists.
delete_post_meta($post_id, 'has_calender');
}
}
return $post_id;
}
add_action('save_post', 'save_calender_postmeta');
And then, if you want to get all the posts that have calenders you could use:
/**
* Get all posts and their permalinks that have calenders.
* @global wpdb $wpdb
*/
function get_calender_posts_links()
{
global $wpdb;
$rows = $wpdb->get_results($wpdb->prepare(
"SELECT post_id FROM $wpdb->postmeta WHERE meta_key = %s",
'has_calender'
));
if(!empty($rows)) {
// Let's include the post permalinks with each row.
foreach($rows as $row) {
$row->post_permalink = get_permalink($row->post_id);
}
}
return $rows;
}
Or if you wanted to check if a single post had a calender:
/**
* Check if a post has a calender.
* @param int $post_id
* @return boolean
*/
function post_has_calender($post_id)
{
return (get_post_meta($post_id, 'has_calender'));
}
Let me know if this is what you were looking for.