url_to_postid() WP 1.0.0

Отримує ID запису (поста, сторінки) по переданому УРЛ. Розбирає передане “постійне посилання” і намагається отримати ID запису.

Функція спочатку перевірять, чи містить УРЛ ID дані, якщо не містить, функція проводить поглиблену перевірку: намагається знайти ID використовуючи правила перезапису.

Цю функцію можна як протилежну get_permalink() .

Якщо використовувати url_to_postid(), щоб отримати ID вкладення (attachment, картинки), потрібно, щоб УРЛ був такого формату: example.com/?attachment_id=N , якщо передати посилання на картинку, ID визначити не вийде. Щоб визначити ID за посиланням, можна використовувати такий код:

// отримує attachment ID з URL на файл
function pippin_get_image_id( $image_url ) {
	Global $wpdb;
	$attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url ));
	return $attachment[0];
}

Не найшвидший код, т.к. поле guid не містить індексів у базі даних, тому при пошуку запит перевірить усі поля guid, а їх може бути дуже багато ….

З версії 4.0 з’явилася спеціальна функція, за якою можна отримати ID вкладення, вказавши посилання на вкладення: attachment_url_to_postid()

Примітка: не повертає ID запису для довільних типів.

1 раз – 0.00195 сек
(дуже повільно) | 50000 разів – 93.01 сек
(дуже повільно)

Хуки з функції

Повертає

int. IDпоста/сторінки або 0, якщо не вдалося отримати.

Використання

$postid = url_to_postid($url);
$url
(рядок) (обов’язковий)
Постійне посилання (УРЛ), з якого потрібно отримати ID запису.

Приклади

0

#1 Приклад використання. Отримаємо ID посту з постійного посилання:

$url = "http://example.com/our-company/news/dinner-tcworld-2010.html";
$post_ID = url_to_postid($url);
echo "ID поста = ". $post_ID;
0

#2 Демонстрація роботи функції

var_dump( url_to_postid( 'https://wp-doc.com/function/url_to_postid' ) ); // int(733)
var_dump( url_to_postid( '/function/url_to_postid' ) ); // int(733)
var_dump( url_to_postid( 'https://wp-doc.com/id_15476/dopolnitelnye-polya-dlya-wp_nav_menu.html' ) ); // int(15476)
var_dump( url_to_postid( '/id_15476/dopolnitelnye-polya-dlya-wp_nav_menu.html' ) ); // int(15476)

нотатки

  • Global. WP_Rewrite. $wp_rewrite WordPress rewrite component.
  • Global. WP. $wp Current WordPress environment instance.

список змін

З версії 1.0.0Введено.

Код url_to_postid() WP 6.0.2

function url_to_postid( $url ) {
	global $wp_rewrite;

	/**
	 * Filters the URL для надсилання до post ID від.
	 *
	 * @ Since 2.2.0
	 *
	 * @param string $url URL-адресу буде надіслано до post ID від.
	 */
	$url = apply_filters( 'url_to_postid', $url );

	$url_host = str_replace( 'www.', '', parse_url( $url, PHP_URL_HOST ) );
	$home_url_host = str_replace( 'www.', '', parse_url( home_url(), PHP_URL_HOST ) );

	// Bail early if the URL не може бути до цього дня.
	if ( $url_host && $url_host !== $home_url_host ) {
		return 0;
	}

	// First, check to see if there is a 'p=N' або 'page_id=N' to match against.
	if ( preg_match( '#[?&](p|page_id|attachment_id)=(d+)#', $url, $values ​​) ) {
		$ id = absint ($ values ​​[2]);
		if ($id) {
			return $id;
		}
	}

	// Get rid of the #anchor.
	$url_split = explode('#', $url);
	$url = $url_split[0];

	// Get rid of URL ?query=string.
	$url_split = explode('?', $url);
	$url = $url_split[0];

	// Set the correct URL scheme.
	$ scheme = parse_url (home_url (), PHP_URL_SCHEME);
	$url = set_url_scheme($url, $scheme);

	// Add 'www.' if it is absent and should be there.
	if ( false !== strpos( home_url(), '://www.' ) && false === strpos( $url, '://www.' ) ) {
		$url = str_replace( '://', ​​'://www.', $url );
	}

	// Strip 'www.' if it is present and shouldn't be.
	if ( false === strpos( home_url(), '://www.' ) ) {
		$url = str_replace( '://www.', '://', ​​$url );
	}

	if ( trim( $url, '/' ) === home_url() && 'page' === get_option( 'show_on_front' ) ) {
		$page_on_front = get_option( 'page_on_front');

		if ( $page_on_front && get_post( $page_on_front ) instanceof WP_Post ) {
			return (int) $page_on_front;
		}
	}

	// Check to see if we are using rewrite rules.
	$rewrite = $wp_rewrite->wp_rewrite_rules();

	// Не використовуються перевірені правила, і 'p=N' і 'page_id=N' методи неправильні, тому що ми не вийде з опцій.
	if ( empty ( $ rewrite ) ) {
		return 0;
	}

	// Strip 'index.php/' if we're not using path info permalinks.
	if ( ! $wp_rewrite->using_index_permalinks() ) {
		$url = str_replace( $wp_rewrite->index . '/', '', $url );
	}

	if ( false !== strpos( trailingslashit( $url ), home_url( '/' ) ) ) {
		// Chop off http://domain.com/[path].
		$url = str_replace( home_url(), '', $url );
	} else {
		// Chop off /path/to/blog.
		$home_path = parse_url( home_url( '/' ) );
		$home_path = isset($home_path['path'])? $home_path['path'] : '';
		$url = preg_replace( sprintf( '#^%s#', preg_quote( $home_path ) ), '', trailingslashit( $url ) );
	}

	// Trim leading and lagging slashes.
	$url = trim($url, '/');

	$request = $url;
	$post_type_query_vars = array();

	foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) {
		if ( ! empty( $t->query_var ) ) {
			$post_type_query_vars[ $t->query_var ] = $post_type;
		}
	}

	// Look for matches.
	$ request_match = $ request;
	foreach ((array) $rewrite as $match => $query) {

		// If the requesting file is the anchor of the match,
		// Prepend it to the path info.
		if ( ! empty( $url ) && ( $url != $request ) && ( strpos( $match, $url ) === 0 ) ) {
			$request_match = $url. '/'. $ request;
		}

		if ( preg_match( "#^$match#", $request_match, $matches ) ) {

			if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=$matches[([0-9]+)]/', $query, $varmatch ) ) {
				// Це verbose page match, let's check to be sure about it.
				$page = get_page_by_path( $matches[ $varmatch[1] ] );
				if ( ! $page ) {
					continue;
				}

				$post_status_obj = get_post_status_object( $page->post_status );
				if ( ! $post_status_obj->public && ! $post_status_obj->protected
					&&! $post_status_obj->private && $post_status_obj->exclude_from_search ) {
					continue;
				}
			}

			// Got a match.
			// Trim the query of everything up to the '?'.
			$query = preg_replace( '!^.+?!', '', $query );

			// Substitute substring matches в query.
			$query = addslashes( WP_MatchesMapRegex::apply( $query, $matches ) );

			// Filter out non-public query vars.
			global $wp;
			parse_str($query, $query_vars);
			$query = array();
			foreach ((array) $query_vars as $key => $value ) {
				if ( in_array( (string) $key, $wp->public_query_vars, true ) ) {
					$query[$key] = $value;
					if (isset($post_type_query_vars[$key]))) {
						$query['post_type'] = $post_type_query_vars[$key];
						$query['name'] = $value;
					}
				}
			}

			// Resolve conflicts між posts with numeric slugs and date archive queries.
			$query = wp_resolve_numeric_slug_conflicts( $query );

			// Do the query.
			$ Query = New WP_Query ($ Query);
			if ( ! empty( $query->posts ) && $query->is_singular ) {
				return $query->post->ID;
			} else {
				return 0;
			}
		}
	}
	return 0;
}

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

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