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

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

Если вы забыли ввести заголовок, то 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, и ограничено определенной длиной. Чтобы было видно, что название поста создано автоматически, в конец его добавляется многоточие. Таким образом в название поста попадет чистый текст, даже если в содержимом поста вы используете картинки и видео. Все эти операции происходят во время сохранения поста, поэтому в базу данных записывается уже чистый заголовок.

Создай свой первый сайт на WordPress

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. Андрей

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

    Ответить