@”TPЈUўP=?бTPЈU€`=@pXPЈU`Рџџџџ>+аœTPЈUџџџџP>EРYPЈUPP>BаЛTPЈUџџџџџџџџ€><џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ˜[@џџџџK8$д ч€РтJ@џџџџj^RьЩ“ЈЫS@аЛTPЈUџџџџџџџџ ><0cVPЈU џџџџ>YPЈUpџџџџ>P3XPЈUpџџџџР?{`…UPЈUР@џџџџ?+алTPЈU0џџџџџџџџ@>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџр[@џџџџK8$д ч€РтJ@џџџџj^RьЩ“ЈЫS@алTPЈUРџџџџџџџџџџџџD>оTœ€оTœа‘S@РиNœ0йNœаMœџџџџХ<КчFe—…`[@0ТUœџџџџˆРЄцFe—…Ш[@ уUPЈU€@YЉpжTPЈUџџџџY№щUPЈUPYt№ЇWPЈUр(ZpРYPЈUPPZBаЛTPЈUџџџџџџџџ Z<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ`[@џџџџK8$д ч€РтJ@џџџџj^RьЩ“ЈЫS@ dUPЈUаџџџџр\`…UPЈUр@џџџџ\+алTPЈUрџџџџџџџџ]>рAXPЈU`а№`QРшUPЈU№џџџџџџџџ`>алTPЈU џџџџџџџџџџџџa>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџРСUœџџџџ РчJ@pЛD@†WPЈU€€ Л[p‚UPЈU€pЛZ уUPЈUр ЛЉ@”TPЈUўP|?@”TPЈUў`|?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ@UœџџџџХ<КчFe—…`[@PСUœџџџџˆРЄцFe—…Ш[@ ЎTPЈU џџџџџџџџ}*PлXPЈU`џџџџš dUPЈUџџџџ `…UPЈU @џџџџ+pXPЈUPџџџџџџџџ€>РƒWPЈU Ђ› АƒRџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ[@џџџџK8$д ч€РтJ@џџџџj^RьЩ“ЈЫS@WPЈUџџџџџџџџƒd CXPЈU` аƒ]€@WPЈUа`ƒЙаЛTPЈUџџџџџџџџрƒ<`…UPЈUр@џџџџƒ+pXPЈU`џџџџџџџџ„>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџШ[@џџџџK8$д ч€РтJ@џџџџj^RьЩ“ЈЫS@€9M@`ГŒ@иПŽ@@”TPЈUўPЋ?№‘XPЈUP@`Ќsp‹UPЈU``Ќ/аœTPЈUџџџџЌEџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ[@џџџџK8$д ч€РтJ@џџџџj^RьЩ“ЈЫS@ dUPЈU€џџџџЌРUPЈUџџџџ`Ќ4`…UPЈU`€џџџџЌ+№ЇWPЈU0ЁP­p€4UPЈUPP­tИTPЈUџџџџџџџџџџџџ­<џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџink->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. * * Previous SELECT-then-INSERT/UPDATE pattern caused deadlocks when * multiple posts linked to the same target post. * * @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; $table = $wpdb->prefix . 'rank_math_internal_meta'; // Build field assignments for ON DUPLICATE KEY UPDATE. $allowed_keys = [ 'incoming_link_count', 'internal_link_count', 'external_link_count' ]; $update_parts = []; foreach ( $meta_data as $key => $value ) { if ( ! in_array( $key, $allowed_keys, true ) ) { continue; } $update_parts[] = $wpdb->prepare( "{$key} = %d", $value ); } // Single operation eliminates SELECT-then-INSERT gap. return $wpdb->query( $wpdb->prepare( "INSERT INTO {$table} (object_id, incoming_link_count, internal_link_count, external_link_count) VALUES (%d, %d, %d, %d) ON DUPLICATE KEY UPDATE " . implode( ', ', $update_parts ), $post_id, $meta_data['incoming_link_count'] ?? 0, $meta_data['internal_link_count'] ?? 0, $meta_data['external_link_count'] ?? 0 ) ); } }