WordPress Version: 6.1
/**
* Returns a shortlink for a post, page, attachment, or site.
*
* This function exists to provide a shortlink tag that all themes and plugins can target.
* A plugin must hook in to provide the actual shortlinks. Default shortlink support is
* limited to providing ?p= style links for posts. Plugins can short-circuit this function
* via the {@see 'pre_get_shortlink'} filter or filter the output via the {@see 'get_shortlink'}
* filter.
*
* @since 3.0.0
*
* @param int $id Optional. A post or site ID. Default is 0, which means the current post or site.
* @param string $context Optional. Whether the ID is a 'site' ID, 'post' ID, or 'media' ID. If 'post',
* the post_type of the post is consulted. If 'query', the current query is consulted
* to determine the ID and context. Default 'post'.
* @param bool $allow_slugs Optional. Whether to allow post slugs in the shortlink. It is up to the plugin how
* and whether to honor this. Default true.
* @return string A shortlink or an empty string if no shortlink exists for the requested resource or if shortlinks
* are not enabled.
*/
function wp_get_shortlink($id = 0, $context = 'post', $allow_slugs = true)
{
/**
* Filters whether to preempt generating a shortlink for the given post.
*
* Returning a value other than false from the filter will short-circuit
* the shortlink generation process, returning that value instead.
*
* @since 3.0.0
*
* @param false|string $return Short-circuit return value. Either false or a URL string.
* @param int $id Post ID, or 0 for the current post.
* @param string $context The context for the link. One of 'post' or 'query',
* @param bool $allow_slugs Whether to allow post slugs in the shortlink.
*/
$shortlink = apply_filters('pre_get_shortlink', false, $id, $context, $allow_slugs);
if (false !== $shortlink) {
return $shortlink;
}
$post_id = 0;
if ('query' === $context && is_singular()) {
$post_id = get_queried_object_id();
$post = get_post($post_id);
} elseif ('post' === $context) {
$post = get_post($id);
if (!empty($post->ID)) {
$post_id = $post->ID;
}
}
$shortlink = '';
// Return `?p=` link for all public post types.
if (!empty($post_id)) {
$post_type = get_post_type_object($post->post_type);
if ('page' === $post->post_type && get_option('page_on_front') == $post->ID && 'page' === get_option('show_on_front')) {
$shortlink = home_url('/');
} elseif ($post_type && $post_type->public) {
$shortlink = home_url('?p=' . $post_id);
}
}
/**
* Filters the shortlink for a post.
*
* @since 3.0.0
*
* @param string $shortlink Shortlink URL.
* @param int $id Post ID, or 0 for the current post.
* @param string $context The context for the link. One of 'post' or 'query',
* @param bool $allow_slugs Whether to allow post slugs in the shortlink. Not used by default.
*/
return apply_filters('get_shortlink', $shortlink, $id, $context, $allow_slugs);
}