主代码请检查此块后的辅助代码
/*
* Prevent Duplicated Titles
*
*/
if( is_admin() ) // check if we are in the administrative area
{
add_action( \'save_post\', \'wpse_54258_check_for_duplicate_title\', 11, 2 );
add_action( \'admin_head-post.php\', \'wpse_54258_check_for_notice\' );
}
/*
* Checks for more than one post with the same title
*
* Adds filter redirect_post_location if duplicate title found
*
*/
function wpse_54258_check_for_duplicate_title( $post_id, $post )
{
// HERE, FURTHER FILTERING CAN BE DONE, RESTRICT USERS, POST_TYPES, ETC
if (
( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
or ! current_user_can( \'edit_post\', $post_id )
or wp_is_post_revision( $post )
// ADD OTHER FILTERS, LIKE post_type
)
{ // Noting to do.
return;
}
$termid = get_post_meta($post_id, \'_is_dup\', true);
if ( \'\' != $termid )
{
// it\'s a new record
$count_dups = 0;
update_post_meta($post_id, \'_is_dup\', \'new-post-check\');
}
else
{
$count_dups = 1;
}
// NO CHECKING IS BEING DONE REGARDING UPPER AND LOWERCASES, NOR FOR HTML TAGS
global $wpdb;
$title_exists = $wpdb->get_results( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = \'$post->post_title\' AND post_status = \'publish\'") );
if( count($title_exists) > $count_dups )
add_filter(\'redirect_post_location\',\'wpse_54258_add_error_query_var\');
}
/*
* Removes the previous applied filter and adds error var to the redirect
*
*/
function wpse_54258_add_error_query_var( $loc )
{
remove_filter( \'redirect_post_location\',\'wpse_54258_add_error_query_var\' );
return add_query_arg( \'duplicated_title\', 123, $loc );
}
/*
* Error checking after saving the post
*
*/
function wpse_54258_check_for_notice()
{
if( isset( $_GET[\'duplicated_title\'] ) )
add_action( \'admin_notices\', \'wpse_54258_display_error_message\' );
}
/*
* Actual error message for duplicated post titles
*
*/
function wpse_54258_display_error_message()
{ ?>
<div class="error fade">ERROR</div>
<?php
remove_action( \'admin_notices\', \'wpse_54258_display_error_message\' );
}
用于检查是否正在创建新帖子/页面的方法需要
post_meta
这必须应用于以前的所有帖子/页面。
/*
* Update ALL PUBLISHED posts and pages with the controller post_meta required by the main code
*
* Important: Run Only Once
* -> Paste in functions.php
* -> Remove the comment to add_action
* -> Visit any administrative page
* -> Delete or disable this code
*
*/
//add_action(\'admin_init\',\'wpse_54258_run_only_once\');
function wpse_54258_run_only_once()
{
global $wpdb;
$allposts = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_status = \'published\'" );
foreach( $allposts as $pt )
{
update_post_meta( $pt->ID, \'_is_dup\', \'new-post-check\');
}
}
这个答案是通过以下方式组合而成的:
托肖对这个问题的回答:Take excerpt of the content of the post and send it as the title to create new post
Otto\'s solution 在Ana Ban提供的链接中,回答如下:Passing error/warning messages from a meta box to "admin_notices"要解决创建新帖子/页面的时刻,这里的一个变体可以回答这个问题:Check for update vs new post on save_post action一本关于post-new.php
死亡医生对另一个问题的回答是:Why does save_post action fire when creating a new post?