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

Способ, помогающий избежать сохранения поста без названия - автоматическое создание названия поста из его содержимого.

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

Комментарии