You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
4.6 KiB
PHTML
182 lines
4.6 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The DB interface.
|
||
|
*
|
||
|
* @since 0.9.0
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Links
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Links;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Storage class.
|
||
|
*
|
||
|
* @copyright Copyright (C) 2008-2019, Yoast BV
|
||
|
* The following code is a derivative work of the code from the Yoast(https://github.com/Yoast/wordpress-seo/), which is licensed under GPL v3.
|
||
|
*/
|
||
|
class Storage {
|
||
|
|
||
|
/**
|
||
|
* Get query builder.
|
||
|
*
|
||
|
* @return \RankMath\Admin\Database\Query_Builder
|
||
|
*/
|
||
|
private function table() {
|
||
|
return \RankMath\Helpers\DB::query_builder( 'rank_math_internal_links' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all data for a given post.
|
||
|
*
|
||
|
* @param int $post_id The post ID to remove the records for.
|
||
|
*
|
||
|
* @return int|false The number of rows updated, or false on error.
|
||
|
*/
|
||
|
public function cleanup( $post_id ) {
|
||
|
return $this->table()->where( 'post_id', $post_id )->delete();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get array of links from the database for given post.
|
||
|
*
|
||
|
* @param int $post_id The post to get the links for.
|
||
|
*
|
||
|
* @return Link[] The links array.
|
||
|
*/
|
||
|
public function get_links( $post_id ) {
|
||
|
$links = [];
|
||
|
$results = $this->table()
|
||
|
->select( [ 'url', 'post_id', 'target_post_id', 'type' ] )
|
||
|
->where( 'post_id', $post_id )
|
||
|
->get();
|
||
|
|
||
|
foreach ( $results as $link ) {
|
||
|
$links[] = new Link( $link->url, $link->target_post_id, $link->type );
|
||
|
}
|
||
|
|
||
|
return $links;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Save links for a post.
|
||
|
*
|
||
|
* @param integer $post_id The post ID to save.
|
||
|
* @param Link[] $links The links to save.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function save_links( $post_id, array $links ) {
|
||
|
foreach ( $links as $link ) {
|
||
|
$this->table()->insert(
|
||
|
[
|
||
|
'url' => $link->get_url(),
|
||
|
'post_id' => $post_id,
|
||
|
'target_post_id' => $link->get_target_post_id(),
|
||
|
'type' => $link->get_type(),
|
||
|
],
|
||
|
[ '%s', '%d', '%d', '%s' ]
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update the link counts for a post and its referenced posts.
|
||
|
*
|
||
|
* @param int $post_id Post to update.
|
||
|
* @param int|null $counts Links count.
|
||
|
* @param Link[] $links Links to update incoming link count.
|
||
|
*/
|
||
|
public function update_link_counts( $post_id, $counts, array $links ) {
|
||
|
$counts = wp_parse_args(
|
||
|
$counts,
|
||
|
[
|
||
|
'internal_link_count' => 0,
|
||
|
'external_link_count' => 0,
|
||
|
]
|
||
|
);
|
||
|
|
||
|
$this->save_meta_data( $post_id, $counts );
|
||
|
$this->update_incoming_links( $post_id, $links );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update the incoming link count.
|
||
|
*
|
||
|
* @param int $post_id Post which is processed.
|
||
|
* @param Link[] $links Links we need to update the incoming link count of.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function update_incoming_links( $post_id, $links ) {
|
||
|
$post_ids = $this->get_internal_post_ids( $links );
|
||
|
$post_ids = array_merge( [ $post_id ], $post_ids );
|
||
|
$this->update_incoming_link_count( $post_ids );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get post IDs from the link objects.
|
||
|
*
|
||
|
* @param Link[] $links Links we need to update the incoming link count of.
|
||
|
*
|
||
|
* @return int[] List of post IDs.
|
||
|
*/
|
||
|
protected function get_internal_post_ids( $links ) {
|
||
|
$post_ids = [];
|
||
|
foreach ( $links as $link ) {
|
||
|
$post_ids[] = $link->get_target_post_id();
|
||
|
}
|
||
|
|
||
|
return array_filter( $post_ids );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update the incoming link count.
|
||
|
*
|
||
|
* @param array $post_ids The posts to update the link count for.
|
||
|
*/
|
||
|
public function update_incoming_link_count( array $post_ids ) {
|
||
|
$results = $this->table()
|
||
|
->selectCount( 'id', 'incoming' )
|
||
|
->select( 'target_post_id as post_id' )
|
||
|
->whereIn( 'target_post_id', $post_ids )
|
||
|
->groupBy( 'target_post_id' )->get();
|
||
|
|
||
|
$post_ids_non_zero = [];
|
||
|
foreach ( $results as $result ) {
|
||
|
$this->save_meta_data( $result->post_id, [ 'incoming_link_count' => $result->incoming ] );
|
||
|
$post_ids_non_zero[] = $result->post_id;
|
||
|
}
|
||
|
|
||
|
$post_ids_zero = array_diff( $post_ids, $post_ids_non_zero );
|
||
|
foreach ( $post_ids_zero as $post_id ) {
|
||
|
$this->save_meta_data( $post_id, [ 'incoming_link_count' => 0 ] );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Save the link count to the database.
|
||
|
*
|
||
|
* @param int $post_id The ID to save the link count for.
|
||
|
* @param array $meta_data The total amount of links.
|
||
|
*/
|
||
|
public function save_meta_data( $post_id, array $meta_data ) {
|
||
|
global $wpdb;
|
||
|
|
||
|
$where = [ 'object_id' => $post_id ];
|
||
|
$exists = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM {$wpdb->prefix}rank_math_internal_meta WHERE object_id = %d", $post_id ) );
|
||
|
|
||
|
if ( $exists ) {
|
||
|
$result = $wpdb->update( $wpdb->prefix . 'rank_math_internal_meta', $meta_data, $where );
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
$data = array_merge( $where, $meta_data );
|
||
|
$result = $wpdb->insert( $wpdb->prefix . 'rank_math_internal_meta', $data );
|
||
|
return $result;
|
||
|
}
|
||
|
}
|