do_enclose() WP 1.5.0

Перевіряє вказаний запис на наявність у його контенті посилань на Відео та Аудіо. Якщо посилання знайдені, то додає ці URL до мета-поля enclosure.

Перед додаванням чергового мета-поля enclosureперевіряє чи немає таких самих даних. Видаляє метаполі enclosure, які були видалені з посту.

Це внутрішня функція WP. Запускається у функції do_all_pings :

add_action( 'publish_post', '_publish_post_hook', 5, 1); // Тут створюється крон завдання
	→ wp_schedule_single_event( time(), 'do_pings');
		// це спрацьовує за Кроном
		→ add_action( 'do_pings', 'do_all_pings', 10, 0);
			→ add_action( 'do_all_pings', 'do_all_enclosures', 10, 0);

Як це працює детальніше читайте тут .

Читайте також: WP Cron .

Працює на основі:
get_enclosed() ,
wp_extract_urls()

Хуки з функції
do_enclose($content, $post);
$content
(рядок|null) (обов’язковий)
Зазвичай тут вказується
null! Контент посту. Якщо
null , поле
post_content використовується з
$post .
$post
(int|
WP_Post ) (обов’язковий)
ID посту або об’єкт посту.

Приклади


0

#1 Використання в ядрі WP

Дивіться код функції do_all_enclosures() .

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 1.5.0Введено.
З версії 5.3.0$content parameter був зроблений optional, і $ post parameter був updated to accept a post ID або WP_Post object.
З версії 5.6.0$content parameter не є longer опційним, але проходить null до skip it is still supported.

Код do_enclose() WP 6.0.2

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

	// @todo Tidy цей код і зробити розмітку коду optional.
	include_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 ) {
		// Link is no longer in post.
		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 we haven't pung it already.
		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;
			}
		}
	}

	/**
	 * Filters List of enclosure links before querying the database.
	 *
	 * Натисніть на додаток і/або відновити потенційні дзвінки на захист
	 * до postmeta до checking database for existing enclosures.
	 *
	 * @ Since 4.4.0
	 *
	 * @param string[] $post_links На array of enclosure links.
	 * @param int $post_ID Post 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 && ! $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' );

				// Виберіть, щоб дізнатися, як ми можемо побачити тип мім від extension.
				$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" );
				}
			}
		}
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *