alink ) {
if ( $type === SEO_Links::TYPE_INTERNAL ) {
return \url_to_postid( $permalink );
}
return $this->image_helper->get_attachment_by_url( $permalink );
}
/**
* Creates an internal link.
*
* @param string $url The url of the link.
* @param array $home_url The home url, as parsed by wp_parse_url.
* @param Indexable $indexable The indexable of the post containing the link.
* @param bool $is_image Whether or not the link is an image.
* @param int $image_id The ID of the internal image.
*
* @return SEO_Links The created link.
*/
protected function create_internal_link( $url, $home_url, $indexable, $is_image = false, $image_id = 0 ) {
$parsed_url = \wp_parse_url( $url );
$link_type = $this->url_helper->get_link_type( $parsed_url, $home_url, $is_image );
/**
* ORM representing a link in the SEO Links table.
*
* @var SEO_Links $model
*/
$model = $this->seo_links_repository->query()->create(
[
'url' => $url,
'type' => $link_type,
'indexable_id' => $indexable->id,
'post_id' => $indexable->object_id,
]
);
$model->parsed_url = $parsed_url;
if ( $model->type === SEO_Links::TYPE_INTERNAL ) {
$permalink = $this->build_permalink( $url, $home_url );
return $this->enhance_link_from_indexable( $model, $permalink );
}
if ( $model->type === SEO_Links::TYPE_INTERNAL_IMAGE ) {
$permalink = $this->build_permalink( $url, $home_url );
/** The `wpseo_force_creating_and_using_attachment_indexables` filter is documented in indexable-link-builder.php */
if ( ! $this->options_helper->get( 'disable-attachment' ) || \apply_filters( 'wpseo_force_creating_and_using_attachment_indexables', false ) ) {
$model = $this->enhance_link_from_indexable( $model, $permalink );
}
else {
$target_post_id = ( $image_id !== 0 ) ? $image_id : WPSEO_Image_Utils::get_attachment_by_url( $permalink );
if ( ! empty( $target_post_id ) ) {
$model->target_post_id = $target_post_id;
}
}
if ( $model->target_post_id ) {
$file = \get_attached_file( $model->target_post_id );
if ( $file ) {
if ( \file_exists( $file ) ) {
$model->size = \filesize( $file );
}
else {
$model->size = null;
}
list( , $width, $height ) = \wp_get_attachment_image_src( $model->target_post_id, 'full' );
$model->width = $width;
$model->height = $height;
}
else {
$model->width = 0;
$model->height = 0;
$model->size = 0;
}
}
}
return $model;
}
/**
* Enhances the link model with information from its indexable.
*
* @param SEO_Links $model The link's model.
* @param string $permalink The link's permalink.
*
* @return SEO_Links The enhanced link model.
*/
protected function enhance_link_from_indexable( $model, $permalink ) {
$target = $this->indexable_repository->find_by_permalink( $permalink );
if ( ! $target ) {
// If target indexable cannot be found, create one based on the post's post ID.
$post_id = $this->get_post_id( $model->type, $permalink );
if ( $post_id && $post_id !== 0 ) {
$target = $this->indexable_repository->find_by_id_and_type( $post_id, 'post' );
}
}
if ( ! $target ) {
return $model;
}
$model->target_indexable_id = $target->id;
if ( $target->object_type === 'post' ) {
$model->target_post_id = $target->object_id;
}
if ( $model->target_indexable_id ) {
$model->language = $target->language;
$model->region = $target->region;
}
return $model;
}
/**
* Builds the link's permalink.
*
* @param string $url The url of the link.
* @param array $home_url The home url, as parsed by wp_parse_url.
*
* @return string The link's permalink.
*/
protected function build_permalink( $url, $home_url ) {
$permalink = $this->get_permalink( $url, $home_url );
if ( $this->url_helper->is_relative( $permalink ) ) {
// Make sure we're checking against the absolute URL, and add a trailing slash if the site has a trailing slash in its permalink settings.
$permalink = $this->url_helper->ensure_absolute_url( \user_trailingslashit( $permalink ) );
}
return $permalink;
}
/**
* Filters out links that point to the same page with a fragment or query.
*
* @param SEO_Links $link The link.
* @param array $current_url The url of the page the link is on, as parsed by wp_parse_url.
*
* @return bool Whether or not the link should be filtered.
*/
protected function filter_link( SEO_Links $link, $current_url ) {
$url = $link->parsed_url;
// Always keep external links.
if ( $link->type === SEO_Links::TYPE_EXTERNAL ) {
return true;
}
// Always keep links with an empty path or pointing to other pages.
if ( isset( $url['path'] ) ) {
return empty( $url['path'] ) || $url['path'] !== $current_url['path'];
}
// Only keep links to the current page without a fragment or query.
return ( ! isset( $url['fragment'] ) && ! isset( $url['query'] ) );
}
/**
* Updates the link counts for related indexables.
*
* @param Indexable $indexable The indexable.
* @param SEO_Links[] $links The link models.
*
* @return void
*/
protected function update_related_indexables( $indexable, $links ) {
// Old links were only stored by post id, so remove all old seo links for this post that have no indexable id.
// This can be removed if we ever fully clear all seo links.
if ( $indexable->object_type === 'post' ) {
$this->seo_links_repository->delete_all_by_post_id_where_indexable_id_null( $indexable->object_id );
}
$updated_indexable_ids = [];
$old_links = $this->seo_links_repository->find_all_by_indexable_id( $indexable->id );
$links_to_remove = $this->links_diff( $old_links, $links );
$links_to_add = $this->links_diff( $links, $old_links );
if ( ! empty( $links_to_remove ) ) {
$this->seo_links_repository->delete_many_by_id( \wp_list_pluck( $links_to_remove, 'id' ) );
}
if ( ! empty( $links_to_add ) ) {
$this->seo_links_repository->insert_many( $links_to_add );
}
foreach ( $links_to_add as $link ) {
if ( $link->target_indexable_id ) {
$updated_indexable_ids[] = $link->target_indexable_id;
}
}
foreach ( $links_to_remove as $link ) {
if ( $link->target_indexable_id ) {
$updated_indexable_ids[] = $link->target_indexable_id;
}
}
$this->update_incoming_links_for_related_indexables( $updated_indexable_ids );
}
/**
* Creates a diff between two arrays of SEO links, based on urls.
*
* @param SEO_Links[] $links_a The array to compare.
* @param SEO_Links[] $links_b The array to compare against.
*
* @return SEO_Links[] Links that are in $links_a, but not in $links_b.
*/
protected function links_diff( $links_a, $links_b ) {
return \array_udiff(
$links_a,
$links_b,
static function( SEO_Links $link_a, SEO_Links $link_b ) {
return \strcmp( $link_a->url, $link_b->url );
}
);
}
/**
* Returns the number of internal links in an array of link models.
*
* @param SEO_Links[] $links The link models.
*
* @return int The number of internal links.
*/
protected function get_internal_link_count( $links ) {
$internal_link_count = 0;
foreach ( $links as $link ) {
if ( $link->type === SEO_Links::TYPE_INTERNAL ) {
++$internal_link_count;
}
}
return $internal_link_count;
}
/**
* Returns a cleaned permalink for a given link.
*
* @param string $link The raw URL.
* @param array $home_url The home URL, as parsed by wp_parse_url.
*
* @return string The cleaned permalink.
*/
protected function get_permalink( $link, $home_url ) {
// Get rid of the #anchor.
$url_split = \explode( '#', $link );
$link = $url_split[0];
// Get rid of URL ?query=string.
$url_split = \explode( '?', $link );
$link = $url_split[0];
// Set the correct URL scheme.
$link = \set_url_scheme( $link, $home_url['scheme'] );
// Add 'www.' if it is absent and should be there.
if ( \strpos( $home_url['host'], 'www.' ) === 0 && \strpos( $link, '://www.' ) === false ) {
$link = \str_replace( '://', '://www.', $link );
}
// Strip 'www.' if it is present and shouldn't be.
if ( \strpos( $home_url['host'], 'www.' ) !== 0 ) {
$link = \str_replace( '://www.', '://', $link );
}
return $link;
}
/**
* Updates incoming link counts for related indexables.
*
* @param int[] $related_indexable_ids The IDs of all related indexables.
*
* @return void
*/
protected function update_incoming_links_for_related_indexables( $related_indexable_ids ) {
if ( empty( $related_indexable_ids ) ) {
return;
}
$counts = $this->seo_links_repository->get_incoming_link_counts_for_indexable_ids( $related_indexable_ids );
foreach ( $counts as $count ) {
$this->indexable_repository->update_incoming_link_count( $count['target_indexable_id'], $count['incoming'] );
}
}
}
يستعد التحالف الدولي ضد تنظيم داعش الإرهابي بدعوة من الولايات المتحدة، لاستعادة معاقل “الجهاديين” في الموصل العراقية والرقة السورية وتحريرها من قبضة التنظيم. ودعا وزير الخارجية الأمريكي جون كيري في الاجتماع …
خطيب الرحمن يتحدث عن “آثار سلبية ” للسياحة في الاهوار أزاميل/ بغداد أكد إمام وخطيب جامع الرحمن في بغداد اليوم الجمعة، أن أكثر من 8 ملايين مواطن عراقي يعيشون تحت …
شاهد متابعة مباشرة:إطلاق نار في ميونخ وأنباء عن إطلاق نار في 3 أماكن متفرقة وسقوط 15 قتيلا برلين – وكالات دعت شرطة ميونيخ السكان للبقاء في منازلهم أو الاختباء في …
دعوة لاكتشاف قوانين الشهوة العربية: بين إنقلاب أردوغان وذبح طفل فلسطيني على يد بعض عشاقه كتب منصور الناصر/ نحن شعوب ترفض الحقيقة..تخشاها بشدة، ولذلك نجدها مستعدة لتشويهها في أية لحظة …
السفارة الأميركية بالسعودية تحذر مواطنيها من “تهديد محتمل وشيك” في جدة حذرت السفارة الأميركية في السعودية، اليوم الخميس، مواطنيها من “تهديد محتمل وشيك” في مدينة جدة. وقالت السفارة بحسب “رويترز”، إنها …
ﻋﻠﻲ ﺍﻻﺩﻳﺐ:ﻳﻄﺎﻟﺐ في ﻣﺠﻠﺲ ﺍﻟﻨﻮﺍﺏ بوضع حد لمجانية التعليم وخاصة في الجامعات اصدر رئيس كتلة دولة القانون البرلمانية علي الأديب، الخميس، توضيحا بشأن مقطع فيديو نسب له تحدث فيه …
عن ذبح الطفولة و”طبخها”! الذبيح عبد الله عيسى 12 عاماً المصاب برصاصة بفخذه يستسلم لسكاكين الزنكي الذباح متين النحلاوي ونور الدين زنكي، الذي تحمل اسمه المعارضة المعتدلة التي ذبحت طفلا …
بماذا تختلف المعارضة المعتدلة التي ذبحت طفلا في الـ12 من عمره عن الذين ذبحوا 1700 شاب في سبايكر؟ كم تشبه احداث اليوم عما حصل قبل عامين وقبل عقدين وحتى …
من هو رجب طيب أردوغان؟ هذه سيرة نشرها أحد المعجبين به سنة 2011.. وبالطبع هناك سيرة تعارضها من قبل منافسيه وسننشرها لاحقا لكي نستطيع الحكم بحيادية رجب طيب أردوغان ولد …
انتشرت على مواقع التواصل الاجتماعي مقاطع فيديو لمسلحين يعتقد أنهم من المعارضة السورية في حلب أثناء قطع رأس طفل في 12 من عمره لأنه “يقاتل إلى جانب القوات الموالية …
اعتقلت الشرطة البلجيكية 10 لاجئين عراقيين للاشتباه بصلتهم بتنظيم “الدولة الإسلامية” الإرهابي، وفقا لما أفادت به صحيفة “Gazette”، الأربعاء 20 يوليو/تموز. وبحسب الصحيفة فإن الشرطة أطلقت سراح أحد المعتقلين بعد …
This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.
Strictly Necessary Cookies
Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.
If you disable this cookie, we will not be able to save your preferences. This means that every time you visit this website you will need to enable or disable cookies again.