array( 'page', 'post' ), 'check_latin' => 1, 'check_words' => 1, 'check_abbr' => 1, 'common_terms' => 1, 'menus' => 1, 'site_title' => 1, 'exceptions' => '', ); /** * Значения по умолчанию. Дополнения добавляют свои ключи. * * @param array $defaults Настройки. */ return apply_filters( 'ysno/settings_defaults', $defaults ); } public static function all() { if ( null === self::$cache ) { $stored = get_option( self::OPTION, array() ); self::$cache = array_merge( self::defaults(), is_array( $stored ) ? $stored : array() ); } return self::$cache; } public static function get( $key ) { $all = self::all(); return $all[ $key ] ?? null; } public static function update( array $settings ) { update_option( self::OPTION, $settings, false ); self::$cache = null; } /** Исключения владельца сайта: товарные знаки, названия, фирменные обозначения. */ public static function exceptions() { $list = array(); foreach ( preg_split( '/\R/', (string) self::get( 'exceptions' ) ) as $line ) { $line = trim( $line ); if ( '' !== $line ) { $list[] = $line; } } /** * Исключения: слова и фразы, которые не считаются нарушением. * * @param string[] $list Исключения. */ return array_values( array_unique( (array) apply_filters( 'ysno/exceptions', $list ) ) ); } /** Добавить слово в исключения. */ public static function add_exception( $word ) { $word = trim( sanitize_text_field( $word ) ); if ( '' === $word ) { return; } $all = self::all(); $lower = array_map( array( 'YSNO_Checker', 'lower' ), self::exceptions() ); if ( in_array( YSNO_Checker::lower( $word ), $lower, true ) ) { return; } $all['exceptions'] = trim( (string) $all['exceptions'] . "\n" . $word ); self::update( $all ); } /** Типы записей, которые можно проверять. */ public static function available_post_types() { $out = array(); foreach ( get_post_types( array( 'public' => true ), 'objects' ) as $type ) { if ( in_array( $type->name, array( 'attachment' ), true ) ) { continue; } $out[ $type->name ] = $type->labels->name; } /** * Типы записей, которые можно выбрать для проверки: все публичные (страницы, записи, товары WooCommerce и другие). * * @param array $out Тип => название. * @param array $all То же (совместимость с прежними версиями). */ return (array) apply_filters( 'ysno/post_types', $out, $out ); } /** * Один раз отмечает товары WooCommerce для проверки, если магазин есть на сайте. * Дальше владелец сайта сам выбирает типы записей в настройках. */ public static function maybe_add_products() { if ( get_option( 'ysno_types_added' ) || ! post_type_exists( 'product' ) ) { return; } $s = self::all(); if ( ! in_array( 'product', (array) $s['post_types'], true ) ) { $s['post_types'][] = 'product'; self::update( $s ); } update_option( 'ysno_types_added', 1, false ); } }