Как на сайте WordPress подсчитывать количество именно кириллических символов в записях (выводить в админке записи, в списке записей, а также выводить на сайте в рубрике)

Скрипт, который будет подсчитывать количество именно кириллических символов в записях (выводить в админке записи, в списке записей,
а также выводить на сайте в рубрике

Если количество символов будет менее 100 – то в архиве залить красным, если менее 200 – то синий, если более 200 – то зеленый.

Добавлен автоперевод в черновик: при сохранении записи с < 100 символами она автоматически становится черновиком Уведомление админу: после сохранения появится жёлтое уведомление о переводе в черновик Предупреждение в редакторе

/**
 * Подсчёт КИРИЛЛИЧЕСКИХ символов + автоперевод в черновик
 * Для сайта fenv.ru
 */

// Функция подсчёта кириллических символов (надёжная через Unicode)
function fenv_count_cyrillic( $text ) {
    if ( empty( $text ) ) return 0;
    $text = wp_strip_all_tags( strip_shortcodes( $text ) );
    // \p{Cyrillic} - все символы кириллицы из Unicode, надёжнее чем диапазоны
    preg_match_all( '/\p{Cyrillic}/u', $text, $matches );
    return isset( $matches[0] ) ? count( $matches[0] ) : 0;
}

// Автоматический пересчёт + перевод в черновик при < 100 символах
add_action( 'save_post', 'fenv_auto_draft_on_save', 10, 3 );
function fenv_auto_draft_on_save( $post_id, $post, $update ) {
    if ( wp_is_post_revision( $post_id ) ) return;
    if ( wp_is_post_autosave( $post_id ) ) return;
    if ( $post->post_status === 'auto-draft' ) return;
    if ( ! in_array( $post->post_type, array( 'post', 'page' ) ) ) return;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
    
    $content = $post->post_title . ' ' . $post->post_content;
    $count = fenv_count_cyrillic( $content );
    update_post_meta( $post_id, '_cyrillic_char_count', intval( $count ) );
    
    // ЕСЛИ МЕНЬШЕ 100 КИРИЛЛИЧЕСКИХ СИМВОЛОВ - отправляем в черновик
    if ( $count < 100 && $post->post_status !== 'draft' && $post->post_status !== 'trash' ) {
        // Защита от бесконечного цикла
        remove_action( 'save_post', 'fenv_auto_draft_on_save', 10 );
        
        wp_update_post( array(
            'ID'          => $post_id,
            'post_status' => 'draft',
        ) );
        
        add_action( 'save_post', 'fenv_auto_draft_on_save', 10, 3 );
        
        update_post_meta( $post_id, '_fenv_auto_drafted', 1 );
        set_transient( 'fenv_auto_draft_notice_' . get_current_user_id(), $post_id, 60 );
    }
}

// Массовый пересчёт для старых записей (один раз)
add_action( 'admin_init', 'fenv_bulk_count_cyrillic_once_v2' );
function fenv_bulk_count_cyrillic_once_v2() {
    if ( ! current_user_can( 'manage_options' ) ) return;
    if ( get_option( 'fenv_cyrillic_count_done_v2' ) ) return;

    $posts = get_posts( array(
        'post_type'      => array( 'post', 'page' ),
        'posts_per_page' => -1,
        'post_status'    => 'any',
    ) );

    foreach ( $posts as $p ) {
        $content = $p->post_title . ' ' . $p->post_content;
        $count = fenv_count_cyrillic( $content );
        update_post_meta( $p->ID, '_cyrillic_char_count', intval( $count ) );
    }

    update_option( 'fenv_cyrillic_count_done_v2', 1 );
}

// Функция для получения количества символов
function fenv_get_cyrillic_count( $post_id = null ) {
    if ( ! $post_id ) $post_id = get_the_ID();
    $count = get_post_meta( $post_id, '_cyrillic_char_count', true );
    return $count !== '' ? intval( $count ) : 0;
}

// Вывод бейджа с количеством символов и цветом
function fenv_render_cyrillic_badge( $post_id = null ) {
    $count = fenv_get_cyrillic_count( $post_id );
    $color = 'green';
    if ( $count < 100 )      $color = 'red';
    elseif ( $count < 200 )  $color = 'blue';

    $styles = array(
        'red'   => 'background:#ffe5e5; color:#c00; border:1px solid #f5c2c2;',
        'blue'  => 'background:#e5f0ff; color:#0055cc; border:1px solid #b3d1ff;',
        'green' => 'background:#e6f7e5; color:#1f7a1f; border:1px solid #b5dcb3;',
    );

    echo '<span class="fenv-cyrillic-badge" style="' . esc_attr( $styles[ $color ] ) . ' padding:3px 8px; border-radius:4px; font-size:12px; font-weight:600;">'
         . intval( $count ) . ' символов'
         . '</span>';
}

// Колонка в админке (список записей)
add_filter( 'manage_posts_columns', 'fenv_add_cyrillic_column' );
add_filter( 'manage_pages_columns', 'fenv_add_cyrillic_column' );
function fenv_add_cyrillic_column( $columns ) {
    $columns['cyrillic_count'] = 'Кириллица';
    return $columns;
}

add_action( 'manage_posts_custom_column', 'fenv_fill_cyrillic_column', 10, 2 );
add_action( 'manage_pages_custom_column', 'fenv_fill_cyrillic_column', 10, 2 );
function fenv_fill_cyrillic_column( $column, $post_id ) {
    if ( $column !== 'cyrillic_count' ) return;
    $count = get_post_meta( $post_id, '_cyrillic_char_count', true );
    if ( $count === '' ) {
        $p = get_post( $post_id );
        if ( $p ) {
            $count = fenv_count_cyrillic( $p->post_title . ' ' . $p->post_content );
            update_post_meta( $post_id, '_cyrillic_char_count', intval( $count ) );
        } else {
            $count = 0;
        }
    }
    $count = intval( $count );
    $color = $count < 100 ? '#c00' : ( $count < 200 ? '#0055cc' : '#1f7a1f' );
    echo '<strong style="color:' . esc_attr( $color ) . ';">' . $count . '</strong>';
}

// Сортировка колонки
add_filter( 'manage_edit-post_sortable_columns', 'fenv_sortable_cyrillic_column' );
function fenv_sortable_cyrillic_column( $columns ) {
    $columns['cyrillic_count'] = 'cyrillic_count';
    return $columns;
}

add_action( 'pre_get_posts', 'fenv_sort_cyrillic_query' );
function fenv_sort_cyrillic_query( $query ) {
    if ( ! is_admin() || ! $query->is_main_query() ) return;
    if ( $query->get( 'orderby' ) === 'cyrillic_count' ) {
        $query->set( 'meta_key', '_cyrillic_char_count' );
        $query->set( 'orderby', 'meta_value_num' );
    }
}

// Счётчик в редакторе (под заголовком)
add_action( 'edit_form_after_title', 'fenv_show_count_in_admin_editor' );
function fenv_show_count_in_admin_editor( $post ) {
    if ( ! in_array( $post->post_type, array( 'post', 'page' ) ) ) return;
    
    $count = fenv_count_cyrillic( $post->post_title . ' ' . $post->post_content );
    $color = $count < 100 ? '#c00' : ( $count < 200 ? '#0055cc' : '#1f7a1f' );
    $warning = $count < 100 ? ' <span style="color:#c00; font-weight:normal;">(меньше 100 - будет переведено в черновик!)</span>' : '';
    
    echo '<div style="margin:10px 0; padding:8px 12px; background:#f9f9f9; border-left:4px solid ' . esc_attr( $color ) . ';">';
    echo '<strong>Кириллических символов:</strong> ';
    echo '<span style="color:' . esc_attr( $color ) . '; font-size:16px; font-weight:700;">' . $count . '</span>';
    echo $warning;
    echo '</div>';
}

// Уведомление админу о переводе в черновик
add_action( 'admin_notices', 'fenv_auto_draft_admin_notice' );
function fenv_auto_draft_admin_notice() {
    $post_id = get_transient( 'fenv_auto_draft_notice_' . get_current_user_id() );
    if ( ! $post_id ) return;
    
    delete_transient( 'fenv_auto_draft_notice_' . get_current_user_id() );
    $title = get_the_title( $post_id );
    $edit_link = get_edit_post_link( $post_id );
    
    echo '<div class="notice notice-warning is-dismissible">';
    echo '<p><strong>Запись переведена в черновик!</strong> ';
    echo 'В записи <a href="' . esc_url( $edit_link ) . '">"' . esc_html( $title ) . '"</a> ';
    echo 'меньше 100 кириллических символов. ';
    echo 'Для публикации нужно дополнить текст.</p>';
    echo '</div>';
}

guest
Другие сообщения форума
Закрыть меню