Как избежать пустых заголовков, автоматически создавая их из текстаСпособ, помогающий избежать сохранения поста без названия - автоматическое создание названия поста из его содержимого.
|
Если вы забыли ввести заголовок, то WordPress все равно позволит вам сохранить запись. Сейчас же, при современных форматах записей (например, статус, чат, аудио, видео) и вовсе отпадает надобность в заголовках, а в некоторых темах заголовки таких форматов записей и вовсе не отображаются. Однако если посмотреть RSS, то там такие записи невозможно как-то идентифицировать. Чтобы избежать создания записей без названий, можно внедрить в блог функцию, которая автоматически будет формировать название поста, исходя из его содержимого.
Для этого откройте файл functions.php и вставьте в него по порядку несколько функций:
1Создания заголовка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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 href="' . get_permalink( $temp->ID ) . '">' . $t . ' </a>' . $after; if ( $echo ) echo $out; else return $out; } return false; } |
2Ограничение длины заголовка
1 2 3 4 | function tp_title_from_content( $content ) { $title = tp_excerpted_title( $content, 8 ); return $title; } |
3Исключение шорткодов и разметки HTML и PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function tp_excerpted_title( $content, $word_count ) { $content = strip_tags( $content ); $content = preg_replace ( '#(\[).+?(\])#is', '${1}${2}', $content ); $words = preg_split( '/([\s_;?!\/\(\)\[\]{}<>\r\n\t"]|\.$|(?<=\D)[:,.\-]|[:,.\-](?=\D))/', $content, $word_count + 1, PREG_SPLIT_NO_EMPTY ); if ( count( $words ) > $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; } |
4Сохранение поста с названием
1 2 3 4 5 6 7 8 9 10 11 | 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, и ограничено определенной длиной. Чтобы было видно, что название поста создано автоматически, в конец его добавляется многоточие. Таким образом в название поста попадет чистый текст, даже если в содержимом поста вы используете картинки и видео. Все эти операции происходят во время сохранения поста, поэтому в базу данных записывается уже чистый заголовок.








