Как избежать пустых заголовков, автоматически создавая их из текста
Если вы забыли ввести заголовок, то 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, и ограничено определенной длиной. Чтобы было видно, что название поста создано автоматически, в конец его добавляется многоточие. Таким образом в название поста попадет чистый текст, даже если в содержимом поста вы используете картинки и видео. Все эти операции происходят во время сохранения поста, поэтому в базу данных записывается уже чистый заголовок.
Доброго времени суток! Отличная статья! А есть возможность при публикации записи в название записи писать ID записи? Если да то подскажите как это сделать. Спасибо!
Не понятно, зачем посетителям видеть ID поста. Попробуйте изменить последний код на такой:
Перед названием поста должен появиться его ID. Могу ошибиться, так как я совсем не программист.
Доброго! Спасибо за вариант! Он работает, но не совсем так как надо) я тоже тот еще программист) Суть в том что бы в заголовок записи записывался ID записи. В Вашем варианте он записывается но при условии того что есть контент…
А мне нужно просто что бы был ID без ничего)))
Вот это я не понимаю как сделать)
Нужно это для того что бы можно было публиковать записи без заголовка, а wp в новых версиях почему то не разрешает этого делать… Очень прошу Вас помочь! Еще раз спасибо!
Приветствую Вас. Очень полезное решение, но к сожалению в коде имеются ошибки и выдает 500.
Не работает. Вставил код “последовательно”. Что не так делаю? Нужно автоматически добавлять название клипа.
Наверное, title добавляется, попробую, но тогда нужно, чтобы удалялось это предложение из контента поста, а то дублироваться будет…