Как избежать пустых заголовков, автоматически создавая их из текста

Как избежать пустых заголовков, автоматически создавая их из текста | n-wp.ru Настройки
Способ, помогающий избежать сохранения поста без названия - автоматическое создание названия поста из его содержимого.

Если вы забыли ввести заголовок, то WordPress все равно позволит вам сохранить запись. Сейчас же, при современных форматах записей (например, статус, чат, аудио, видео) и вовсе отпадает надобность в заголовках, а в некоторых темах заголовки таких форматов записей и вовсе не отображаются. Однако если посмотреть RSS, то там такие записи невозможно как-то идентифицировать. Чтобы избежать создания записей без названий, можно внедрить в блог функцию, которая автоматически будет формировать название поста, исходя из его содержимого.

Как избежать пустых заголовков, автоматически создавая их из текста

Для этого откройте файл functions.php и вставьте в него по порядку несколько функций:

Создания заголовка

function tp_the_title( $before = '<h2>', $after = '</h2>', $echo = true ) {
	global $post;

	$temp = $post;
	$t = apply_filters( 'the_title', $temp->post_title );
	$title = $temp->post_title;
	$content = $temp->post_content;
	$pos = 0;
	$out = '';
	$content = trim( $content );
	$title = trim( $title );
	$title = preg_replace( '/...$/', '', $title );
	$title = str_replace( "n", ' ', $title );
	$title = str_replace( '  ', ' ', $title);
	$content = str_replace( "n", ' ', strip_tags( $content) );
	$content = str_replace( '  ', ' ', $content );
	$content = trim( $content );
	$title = the_title();

	if ( false !== strpos( $title, 'http' ) )  {
		$split = @str_split( $content, strpos( $content, 'http' ) );
		$content = $split[0];
		$split2 = @str_split( $title, strpos( $title, 'http' ) );
		$title = $split2[0];
	}

	if ( '' == $title )
		return false;
	$pos = strpos( $content, $title );
	if ( false === $pos || 0 < $pos ) {
		if ( is_single() )
			$out = $before . $t . $after;
		else
			$out = $before . '<a>ID ) . '">' . $t . ' </a>' . $after;

		if ( $echo )
			echo $out;
		else
			return $out;
	}

	return false;
}

Ограничение длины заголовка

function tp_title_from_content( $content ) {
	$title = tp_excerpted_title( $content, 8 );
	return $title;
}

Исключение шорткодов и разметки HTML и PHP

function tp_excerpted_title( $content, $word_count ) {
	$content = strip_tags( $content );
	$content = preg_replace 
    ( 
    '#([).+?(])#is', 
    '${1}${2}', 
    $content
    ); 
	$words = preg_split( '/([s_;?!/()[]{}rnt"]|.$|(? $word_count ) {
		array_pop( $words ); // remove remainder of words
		$content = implode( ' ', $words );
		$content = $content . '...';
	} else {
		$content = implode( ' ', $words );
	}

	$content = trim( strip_tags( $content ) );

	return $content;
}

Сохранение поста с названием

function tp_fix_empty_titles( $post_ID, $post ) {

	if ( empty( $post->post_title ) ) {
		$post->post_title = tp_title_from_content( $post->post_content );
		$post->post_modified = current_time( 'mysql' );
		$post->post_modified_gmt = current_time( 'mysql', 1 );
		return wp_update_post( $post );
	}

}
add_action( 'save_post', 'tp_fix_empty_titles', 10, 2 );

Если вы не ввели название поста, то этот набор функций создаст его из содержимого поста. Предварительно содержимое будет очищено от шорткодов, разметки HTML и PHP, и ограничено определенной длиной. Чтобы было видно, что название поста создано автоматически, в конец его добавляется многоточие. Таким образом в название поста попадет чистый текст, даже если в содержимом поста вы используете картинки и видео. Все эти операции происходят во время сохранения поста, поэтому в базу данных записывается уже чистый заголовок.

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. Сергей

    Доброго времени суток! Отличная статья! А есть возможность при публикации записи в название записи писать ID записи? Если да то подскажите как это сделать. Спасибо!

    Ответить
    1. tiaurus автор

      Не понятно, зачем посетителям видеть ID поста. Попробуйте изменить последний код на такой:

      function tp_fix_empty_titles( $post_ID, $post ) {
       
      	if ( empty( $post->post_title ) ) {
      		$post->post_title = $post->ID ." — ".tp_title_from_content( $post->post_content );
      		$post->post_modified = current_time( 'mysql' );
      		$post->post_modified_gmt = current_time( 'mysql', 1 );
      		return wp_update_post( $post );
      	}
       
      }
      add_action( 'save_post', 'tp_fix_empty_titles', 10, 2 );
      

      Перед названием поста должен появиться его ID. Могу ошибиться, так как я совсем не программист.

      Ответить
      1. Сергей

        Доброго! Спасибо за вариант! Он работает, но не совсем так как надо) я тоже тот еще программист) Суть в том что бы в заголовок записи записывался ID записи. В Вашем варианте он записывается но при условии того что есть контент…
        А мне нужно просто что бы был ID без ничего)))
        Вот это я не понимаю как сделать)
        Нужно это для того что бы можно было публиковать записи без заголовка, а wp в новых версиях почему то не разрешает этого делать… Очень прошу Вас помочь! Еще раз спасибо!

        Ответить
  2. Игорь

    Приветствую Вас. Очень полезное решение, но к сожалению в коде имеются ошибки и выдает 500.

    Ответить
  3. Андрей

    Не работает. Вставил код «последовательно». Что не так делаю? Нужно автоматически добавлять название клипа.

    Ответить