/** * WP_oEmbed_Controller class, used to provide an oEmbed endpoint. * * @package WordPress * @subpackage Embeds * @since 4.4.0 */ /** * oEmbed API endpoint controller. * * Registers the REST API route and delivers the response data. * The output format (XML or JSON) is handled by the REST API. * * @since 4.4.0 */ #[AllowDynamicProperties] final class WP_oEmbed_Controller { /** * Register the oEmbed REST API route. * * @since 4.4.0 */ public function register_routes() { /** * Filters the maxwidth oEmbed parameter. * * @since 4.4.0 * * @param int $maxwidth Maximum allowed width. Default 600. */ $maxwidth = apply_filters( 'oembed_default_width', 600 ); register_rest_route( 'oembed/1.0', '/embed', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_item' ), 'permission_callback' => '__return_true', 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'default' => 'json', 'sanitize_callback' => 'wp_oembed_ensure_format', ), 'maxwidth' => array( 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), ), ), ) ); register_rest_route( 'oembed/1.0', '/proxy', array( array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'get_proxy_item' ), 'permission_callback' => array( $this, 'get_proxy_item_permissions_check' ), 'args' => array( 'url' => array( 'description' => __( 'The URL of the resource for which to fetch oEmbed data.' ), 'required' => true, 'type' => 'string', 'format' => 'uri', ), 'format' => array( 'description' => __( 'The oEmbed format to use.' ), 'type' => 'string', 'default' => 'json', 'enum' => array( 'json', 'xml', ), ), 'maxwidth' => array( 'description' => __( 'The maximum width of the embed frame in pixels.' ), 'type' => 'integer', 'default' => $maxwidth, 'sanitize_callback' => 'absint', ), 'maxheight' => array( 'description' => __( 'The maximum height of the embed frame in pixels.' ), 'type' => 'integer', 'sanitize_callback' => 'absint', ), 'discover' => array( 'description' => __( 'Whether to perform an oEmbed discovery request for unsanctioned providers.' ), 'type' => 'boolean', 'default' => true, ), ), ), ) ); } /** * Callback for the embed API endpoint. * * Returns the JSON object for the post. * * @since 4.4.0 * * @param WP_REST_Request $request Full data about the request. * @return array|WP_Error oEmbed response data or WP_Error on failure. */ public function get_item( $request ) { $post_id = url_to_postid( $request['url'] ); /** * Filters the determined post ID. * * @since 4.4.0 * * @param int $post_id The post ID. * @param string $url The requested URL. */ $post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] ); $data = get_oembed_response_data( $post_id, $request['maxwidth'] ); if ( ! $data ) { return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } return $data; } /** * Checks if current user can make a proxy oEmbed request. * * @since 4.8.0 * * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function get_proxy_item_permissions_check() { if ( ! current_user_can( 'edit_posts' ) ) { return new WP_Error( 'rest_forbidden', __( 'Sorry, you are not allowed to make proxied oEmbed requests.' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** * Callback for the proxy API endpoint. * * Returns the JSON object for the proxied item. * * @since 4.8.0 * * @see WP_oEmbed::get_html() * @global WP_Embed $wp_embed WordPress Embed object. * @global WP_Scripts $wp_scripts * * @param WP_REST_Request $request Full data about the request. * @return object|WP_Error oEmbed response data or WP_Error on failure. */ public function get_proxy_item( $request ) { global $wp_embed, $wp_scripts; $args = $request->get_params(); // Serve oEmbed data from cache if set. unset( $args['_wpnonce'] ); $cache_key = 'oembed_' . md5( serialize( $args ) ); $data = get_transient( $cache_key ); if ( ! empty( $data ) ) { return $data; } $url = $request['url']; unset( $args['url'] ); // Copy maxwidth/maxheight to width/height since WP_oEmbed::fetch() uses these arg names. if ( isset( $args['maxwidth'] ) ) { $args['width'] = $args['maxwidth']; } if ( isset( $args['maxheight'] ) ) { $args['height'] = $args['maxheight']; } // Short-circuit process for URLs belonging to the current site. $data = get_oembed_response_data_for_url( $url, $args ); if ( $data ) { return $data; } $data = _wp_oembed_get_object()->get_data( $url, $args ); if ( false === $data ) { // Try using a classic embed, instead. /* @var WP_Embed $wp_embed */ $html = $wp_embed->get_embed_handler_html( $args, $url ); if ( $html ) { // Check if any scripts were enqueued by the shortcode, and include them in the response. $enqueued_scripts = array(); foreach ( $wp_scripts->queue as $script ) { $enqueued_scripts[] = $wp_scripts->registered[ $script ]->src; } return (object) array( 'provider_name' => __( 'Embed Handler' ), 'html' => $html, 'scripts' => $enqueued_scripts, ); } return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); } /** This filter is documented in wp-includes/class-wp-oembed.php */ $data->html = apply_filters( 'oembed_result', _wp_oembed_get_object()->data2html( (object) $data, $url ), $url, $args ); /** * Filters the oEmbed TTL value (time to live). * * Similar to the {@see 'oembed_ttl'} filter, but for the REST API * oEmbed proxy endpoint. * * @since 4.8.0 * * @param int $time Time to live (in seconds). * @param string $url The attempted embed URL. * @param array $args An array of embed request arguments. */ $ttl = apply_filters( 'rest_oembed_ttl', DAY_IN_SECONDS, $url, $args ); set_transient( $cache_key, $data, $ttl ); return $data; } } Від плану до перевіреної публікації — 085 -

Від плану до перевіреної публікації — 085


Від плану до перевіреної публікації — 085

Окремий огляд перед запуском допомагає переконатися, що матеріал не містить тимчасових нотаток або службових фрагментів. Якісний текст пояснює причини рішень, показує обмеження й не приховує важливі умови за загальними формулюваннями. Після редагування корисно перечитати статтю як новий відвідувач і перевірити, чи достатньо контексту в кожному розділі.

Чіткі підзаголовки формують маршрут читання, але кожен абзац усе одно повинен залишатися змістовним поза навігацією. Достовірний матеріал відокремлює підтверджені дані від припущень і прямо позначає межі доступної інформації. Рівномірний темп викладу дозволяє поєднати огляд, деталі та практичні рекомендації без різких стрибків між темами.

Схема підготовки матеріалу, варіант 85
Перший контрольний етап підготовки матеріалу.

Планування та послідовність

Для довгих текстів важливо тримати єдину логіку назв, прикладів і висновків від першого абзацу до завершення. Фінальний контроль посилань перевіряє призначення, видимий текст і безпечне оформлення кожного зовнішнього переходу. Альтернативний опис зображення має передавати його зміст, а не дублювати підпис або складатися з випадкових ключових слів.

Технічна перевірка доповнює редакційну: вона знаходить пошкоджену розмітку, пропущені ресурси та неочікувані символи. Добре організована публікація залишається зрозумілою після перенесення між системами й не залежить від прихованого форматування. Критерії приймання потрібно визначити до початку роботи, щоб якість оцінювалася однаково для кожного підготовленого варіанта.

Повторюваний процес не означає однаковий текст: структура стабільна, але приклади, акценти та формулювання залишаються живими. Випадкові скорочення часто створюють додаткові помилки, тому зміни варто робити лише після перевірки їхнього реального впливу. Зворотний зв’язок найкраще працює, коли він конкретно називає проблему, показує місце та пропонує перевірний спосіб виправлення. Для узгодження деталей команда використовує нейтральний тестовий довідник як контрольний приклад, не пов’язаний із реальною послугою.

Публікаційна дисципліна поєднує уважність до деталей із практичним темпом і не перетворює перевірку на формальність. Остаточний матеріал повинен однаково добре читатися на великому екрані й мобільному пристрої без втрати важливого контексту. Надійна редакційна робота починається з чіткого плану, у якому кожен етап має зрозумілу мету та перевірний результат.

Фінальна редакційна перевірка, варіант 85
Перевірка структури перед відкритою публікацією.

Перевірка результату

Команда заздалегідь узгоджує структуру матеріалу, щоб читач легко знаходив потрібний контекст і не губився між деталями. Практичні приклади допомагають пояснити складні рішення без зайвої термінології та зберігають природний ритм розповіді. Перед публікацією автор перевіряє факти, назви, послідовність аргументів і коректність усіх допоміжних матеріалів.

Візуальні елементи доречно підтримують текст, коли вони пояснюють процес, показують результат або додають корисний орієнтир. Редактор оцінює не лише окремі речення, а й логіку переходів між розділами, аби стаття сприймалася як цілісна історія. Добре підготовлений матеріал відповідає на основні запитання одразу, а додаткові подробиці відкриває поступово й послідовно.

Читабельність залежить від конкретних формулювань, помірної довжини абзаців і доречних пояснень для нового читача. Під час фінальної вичитки команда прибирає повтори, уточнює нечіткі місця та перевіряє відповідність заголовка змісту. Стабільний процес дає змогу однаково уважно працювати з короткими новинами, великими оглядами та навчальними матеріалами.