WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Как запретить дублирование заголовков записей

По умолчанию в WordPress можно создавать записи с одинаковыми заголовками. И как выяснялось, поправить это не так-то просто. Во всяком случае подходящего хука под такую задачу я не нашел и в «интернетах» какие-то непонятные или нерабочие решения. Поэтому пришлось использовать не совсем подходящий фильтр wp_insert_post_empty_content, который, впрочем, отлично справляется с задачей.

// Disallow Same Post Title .
add_filter( 'wp_insert_post_empty_content', 'disallow_same_post_title', 10, 2 );

/**
 * Prohibits publish posts with the same title (if such a title
 * already exists for the current post type).
 *
 * The function is designed to be used on a hook:
 *
 *     add_filter( 'wp_insert_post_empty_content', 'disallow_same_post_title', 10, 2 );
 *
 * @param bool  $false
 * @param array $postarr
 *
 * @return bool
 *
 * @author Kama (wp-kama.com)
 */
function disallow_same_post_title( $false, $postarr ){
	global $wpdb;

	// do only for publish post status
	if( $postarr['post_status'] !== 'publish' ){
		return $false;
	}

	$AND = [
		$wpdb->prepare(
			'post_title = %s AND post_type = %s AND post_status = %s',
			$postarr['post_title'], $postarr['post_type'], 'publish'
		)
	];

	// set not post ID if it`s update
	if( ! empty( $postarr['ID'] ) ){
		$AND[] = $wpdb->prepare( "ID != %d", $postarr['ID'] );
	}

	// duplicate post_title
	$dupl_post_id = $wpdb->get_var( "SELECT ID FROM $wpdb->posts WHERE ". implode( ' AND ', $AND ) );

	if( $dupl_post_id ){

		// change error message
		add_filter( 'wp_error_added',
			function( $code, $message, $data, $that ) use ( $dupl_post_id ){
				$code === 'empty_content'
				&& $that->errors[ $code ] = [
					sprintf(
						'Duplicate title! Post with such title already exists: %s',
						get_permalink( $dupl_post_id )
					)
				];
			},
			10, 4
		);

		return true; // stop
	}

	return $false;
}
Комментариев нет
    Войти