Скрипт, который будет подсчитывать количество именно кириллических символов в записях (выводить в админке записи, в списке записей,
а также выводить на сайте в рубрикеЕсли количество символов будет менее 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>';
}