ДОКУМЕНТАЦИЯ ФУНКЦИИ DO_ENCLOSE() │ WP 1.5.0

ДОКУМЕНТАЦИЯ ФУНКЦИИ DO_ENCLOSE() │ WP 1.5.0

Функция do_enclose проверяет содержимое поста на наличие ссылок на видео и аудио для добавления их в виде вложений.

Она не добавляет вложения, которые уже были добавлены, и удаляет вложения, если они больше не присутствуют в посте. Это взаимодействие происходит в форме пингбеков и трекбеков.

Используемые функции

  • get_enclosed() — получает вложения поста.
  • wp_extract_urls() — извлекает URL-ссылки из текста.

Хуки функции

  • enclosure_links — фильтр для списка ссылок на вложения.

Возвращаемое значение

Функция возвращает null или false. Она возвращает false, если пост не найден, и null при успешном выполнении.

Как использовать

do_enclose( $content, $post );

Параметры:

  • $content (строка или null, обязательный): Содержимое поста. Если параметр равен null, используются данные из $post->post_content.
  • $post (int или объект WP_Post, обязательный): ID поста или объект поста.

Примеры использования

Пример 0

Пример 1: Использование в ядре WordPress

Посмотрите код функции do_all_enclosures().

Заметки

  • Глобальная переменная: wpdb — объект, представляющий абстракцию базы данных WordPress.

Изменения

  • С версии 1.5.0: Функция была введена.
  • С версии 5.3.0: Параметр $content стал необязательным, а параметр $post был обновлен для приема ID поста или объекта WP_Post.
  • С версии 5.6.0: Параметр $content более не является необязательным, но все еще поддерживается передача null для его игнорирования.

Код функции do_enclose()

function do_enclose( $content, $post ) {
    global $wpdb;

    // Подключаем необходимый класс
    require_once ABSPATH . WPINC . '/class-IXR.php';

    $post = get_post( $post );
    if ( ! $post ) {
        return false;
    }

    if ( null === $content ) {
        $content = $post->post_content;
    }

    $post_links = array();

    // Получаем ссылки на вложения
    $pung = get_enclosed( $post->ID );

    // Извлекаем все ссылки из содержания поста
    $post_links_temp = wp_extract_urls( $content );

    foreach ( $pung as $link_test ) {
        // Если ссылка больше не в посте
        if ( ! in_array( $link_test, $post_links_temp, true ) ) {
            $mids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $link_test ) . '%' ) );
            foreach ( $mids as $mid ) {
                delete_metadata_by_mid( 'post', $mid );
            }
        }
    }

    foreach ( (array) $post_links_temp as $link_test ) {
        // Если ссылка еще не добавлена в вложения
        if ( ! in_array( $link_test, $pung, true ) ) {
            $test = parse_url( $link_test );
            if ( false === $test ) {
                continue;
            }
            if ( isset( $test['query'] ) ) {
                $post_links[] = $link_test;
            } elseif ( isset( $test['path'] ) && ( '/' !== $test['path'] ) && ( '' !== $test['path'] ) ) {
                $post_links[] = $link_test;
            }
        }
    }

    /**
     * Фильтрует список ссылок на вложения перед запросом к базе данных.
     *
     * Позволяет добавлять и/или удалять потенциальные вложения
     * в метаданные поста перед проверкой существующих вложений в базе данных.
     *
     * @since 4.4.0
     *
     * @param string[] $post_links Массив ссылок на вложения.
     * @param int      $post_id    ID поста.
     */
    $post_links = apply_filters( 'enclosure_links', $post_links, $post->ID );

    foreach ( (array) $post_links as $url ) {
        $url = strip_fragment_from_url( $url );

        if ( '' !== $url && ! $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = 'enclosure' AND meta_value LIKE %s", $post->ID, $wpdb->esc_like( $url ) . '%' ) ) ) {

            $headers = wp_get_http_headers( $url );
            if ( $headers ) {
                $len = isset( $headers['Content-Length'] ) ? (int) $headers['Content-Length'] : 0;
                $type = isset( $headers['Content-Type'] ) ? $headers['Content-Type'] : '';
                $allowed_types = array( 'video', 'audio' );

                // Проверяем, можем ли мы определить mime-тип по расширению
                $url_parts = parse_url( $url );
                if ( false !== $url_parts && ! empty( $url_parts['path'] ) ) {
                    $extension = pathinfo( $url_parts['path'], PATHINFO_EXTENSION );
                    if ( ! empty( $extension ) ) {
                        foreach ( wp_get_mime_types() as $exts => $mime ) {
                            if ( preg_match( '!^(' . $exts . ')$!i', $extension ) ) {
                                $type = $mime;
                                break;
                            }
                        }
                    }
                }

                // Если слышимость типа соответствует видео или аудио, до��авляем его
                if ( in_array( substr( $type, 0, strpos( $type, '/' ) ), $allowed_types, true ) ) {
                    add_post_meta( $post->ID, 'enclosure', "$urln$lenn$mimen" );
                }
            }
        }
    }
}

Связанные функции

Функции API CRON:

  • wp_clear_scheduled_hook()
  • wp_cron()
  • wp_doing_cron()
  • wp_get_scheduled_event()
  • wp_get_schedules()
  • wp_next_scheduled()
  • wp_schedule_event()
  • wp_schedule_single_event()
  • wp_unschedule_event()
  • wp_unschedule_hook()

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *