Publish Your Posts Later On Your Website

I explained quite a while ago about publishing a feed with a certain delay. Of course you can do this also for your frontend. Thus, the content will be published to the reader only after a certain period of time. A little script as an example will show you how.

The function can be expanded, for example, with queries on rights of the logged users or various other requirements.

In the first snippet the output on the frontend is always filtered, only your backend is_admin() and your feed is_feed() keeps untouched. The filter is placed in the example at 15 minutes and these are aligned with the setting of WordPress, so that the time zone will be considered. The 15 minutes will be converted into seconds and subtracted from the value.

<code>
function publish_later_on_frontend( $where ) {

	if ( is_admin() || is_preview() || is_feed() )
		return $where;

	$offset =  15; // minutes
	$offset = ( get_option( 'gmt_offset' ) * 3600 ) - ( $offset * 60 ); // gmt offset of WP options minus custom time
	$where .= " AND post_date < '" . gmdate( 'Y-m-d H:i:s', ( time() + $offset ) ) . "'";

	return $where;
}
add_filter( 'posts_where', 'publish_later_on_frontend' );
</code>

Another brief example will allow all users logged, with minimum rights to read current_user_can('read') - so subscribers, to read the contents. All other visitors will get the content presented 10 days later.

<code>
function publish_later_on_frontend( $where ) {

	if ( is_admin() || is_preview() || is_feed() || current_user_can('read') )
		return $where;

	$offset =  10; // days
	$offset = ( get_option( 'gmt_offset' ) * 3600 ) - ( $offset * 24 * 60 * 60 ); // gmt offset of WP options minus custom time
	$where .= " AND post_date < '" . gmdate( 'Y-m-d H:i:s', ( time() + $offset ) ) . "'";

	return $where;
}
add_filter( 'posts_where', 'publish_later_on_frontend' );
</code>

Alternatives with SQL-Statement:

// with INTERVAL 
$where .= " AND post_date < NOW() - INTERVAL 5 MINUTE"; // DAY, HOUR
 
// with strtotime()
$where .= " AND post_date < FROM_UNIXTIME(" . strtotime("-5 day"). ")";

Well - any other ideas? Then let us know in our comment area. I'm happy to see any improvements to the code, especially in the area of calculation with time.

Comments are closed.

5 comments

  1. curtismchale

    I'm unclear as to why you wouldn't just use the built in scheduling feature of WordPress in the first example?

  2. zaryl

    I'm not sure what is wrong but usually when I set the schedule for the post, it will not be published. I had to do it manually after all.

    hope that these codes can help solve the problem

  3. Frank

    It is only an example, you combinate the source with all ideas, maybe an publish for the first time only on logged in users other what you think. Bu the first one of source is the baasics for doing; maybe publish a little bid latter and only logged in users see the content and can read.

  4. Bambo

    Would it be a correct observation that normal preview does not work?

    I changed

    if ( is_admin() || is_feed() )

    to
    if ( is_admin() || is_feed() || is_preview() )
    and preview works again.
    Seems to work fine and snippet is even more useful.

  5. Frank

    @Bambo: many thanks, right -important conditional tag, but forgotten