function zn_norm_path( $url ) { $p = wp_parse_url( html_entity_decode( trim( $url ) ) ); if ( ! $p ) return ''; $host = isset( $p['host'] ) ? strtolower( preg_replace( '/^www\./', '', $p['host'] ) ) : ''; if ( $host && $host !== 'zahidenotes.com' ) return ''; return '/' . trim( strtolower( isset( $p['path'] ) ? $p['path'] : '' ), '/' ); } function zn_tokens( $s ) { $s = preg_replace( '/_\d+$/', '', strtolower( $s ) ); $parts = preg_split( '/[^a-z0-9]+/', $s, -1, PREG_SPLIT_NO_EMPTY ); $stop = array( 'the', 'of', 'to', 'for', 'and', 'a', 'an', 'in', 'on', 'pdf', 'download', 'free', 'by', 'with', 'is', 'your', 'at', 'all' ); $out = array(); foreach ( $parts as $w ) { if ( in_array( $w, $stop, true ) ) continue; if ( preg_match( '/^20[1-3]\d$/', $w ) ) continue; if ( strlen( $w ) > 3 && substr( $w, -1 ) === 's' ) $w = substr( $w, 0, -1 ); $out[ $w ] = true; } return array_keys( $out ); } function zn_score( $a, $b ) { if ( ! $a || ! $b ) return 0; $i = count( array_intersect( $a, $b ) ); if ( ! $i ) return 0; $u = count( array_unique( array_merge( $a, $b ) ) ); return 0.7 * ( $i / count( $a ) ) + 0.3 * ( $i / $u ); } /* 404 par: jo purana URL approve ho chuka hai usay naye page par 301 */ add_action( 'template_redirect', function () { if ( ! is_404() ) return; $path = '/' . trim( strtolower( (string) parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) ), '/' ); $map = get_option( 'zn_map', array() ); if ( isset( $map[ $path ] ) && strpos( $map[ $path ], 'id:' ) === 0 ) { $l = get_permalink( (int) substr( $map[ $path ], 3 ) ); if ( $l ) { wp_redirect( $l, 301 ); exit; } } }, 0 ); add_action( 'admin_menu', function () { add_management_page( 'ZN Link Mapper', 'ZN Link Mapper', 'manage_options', 'zn-mapper', 'zn_mapper_page' ); } ); function zn_mapper_form( $act, $offset, $label, $auto = false, $extra = '' ) { echo '
'; wp_nonce_field( 'zn_map' ); echo '' . $extra; echo '
'; if ( $auto ) echo ''; } function zn_mapper_page() { if ( ! current_user_can( 'manage_options' ) ) return; echo '

ZN Link Mapper

'; if ( ! function_exists( 'zn_link_is_broken' ) || ! function_exists( 'zn_find_post_id' ) ) { echo '

Pehle ZN Fixer aur ZN Link Cleaner snippets active hone chahiye.

'; return; } global $wpdb; $act = isset( $_POST['act'] ) ? sanitize_key( $_POST['act'] ) : ''; $offset = isset( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 0; if ( $act ) check_admin_referer( 'zn_map' ); $batch = 50; $busy = false; /* ---- 1) SCAN ---- */ if ( $act === 'scan' ) { $scan = $offset === 0 ? array() : get_option( 'zn_scan', array() ); $ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type IN ('post','page') AND post_status IN ('publish','draft','private') ORDER BY ID ASC LIMIT %d OFFSET %d", $batch, $offset ) ); foreach ( $ids as $id ) { $c = $wpdb->get_var( $wpdb->prepare( "SELECT post_content FROM {$wpdb->posts} WHERE ID=%d", $id ) ); if ( ! preg_match_all( '#]*?href=(["\'])(.*?)\1#is', $c, $mm ) ) continue; foreach ( $mm[2] as $u ) { if ( ! zn_link_is_broken( $u ) ) continue; $path = zn_norm_path( $u ); if ( ! $path || $path === '/' ) continue; $scan[ $path ] = isset( $scan[ $path ] ) ? $scan[ $path ] + 1 : 1; } } update_option( 'zn_scan', $scan, false ); $offset += count( $ids ); if ( count( $ids ) === $batch ) { $busy = true; echo '

Scan ho raha hai... ' . (int) $offset . ' items check hue. Tab band na karein.

'; zn_mapper_form( 'scan', $offset, 'Agla batch', true ); } else { echo '

Scan mukammal. ' . count( $scan ) . ' alag broken URLs mile. Neeche review karein.

'; } } /* ---- 2) SAVE ---- */ if ( $act === 'save' ) { $map = get_option( 'zn_map', array() ); $paths = isset( $_POST['p'] ) ? (array) wp_unslash( $_POST['p'] ) : array(); $chs = isset( $_POST['m'] ) ? (array) wp_unslash( $_POST['m'] ) : array(); foreach ( $paths as $h => $path ) { $path = sanitize_text_field( $path ); $v = isset( $chs[ $h ] ) ? sanitize_text_field( $chs[ $h ] ) : 'skip'; if ( $v === 'remove' || preg_match( '/^id:\d+$/', $v ) ) $map[ $path ] = $v; else unset( $map[ $path ] ); } update_option( 'zn_map', $map, false ); echo '

Choices save ho gaye. Jo URL "naye page" par set hain unka purana link Google/visitors ke liye bhi ab naye page par redirect hoga.

'; } /* ---- 3) APPLY ---- */ if ( $act === 'apply' ) { $dry = ! empty( $_POST['dry'] ); $map = get_option( 'zn_map', array() ); $ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type IN ('post','page') AND post_status IN ('publish','draft','private') ORDER BY ID ASC LIMIT %d OFFSET %d", $batch, $offset ) ); $re = 0; $rm = 0; $posts = 0; foreach ( $ids as $id ) { $old = $wpdb->get_var( $wpdb->prepare( "SELECT post_content FROM {$wpdb->posts} WHERE ID=%d", $id ) ); $new = preg_replace_callback( '#]*?href=(["\'])(.*?)\1[^>]*>(.*?)#is', function ( $m ) use ( $map, &$re, &$rm ) { $path = zn_norm_path( $m[2] ); if ( ! $path || ! isset( $map[ $path ] ) ) return $m[0]; $ch = $map[ $path ]; if ( $ch === 'remove' ) { $rm++; return $m[3]; } if ( strpos( $ch, 'id:' ) === 0 ) { $link = get_permalink( (int) substr( $ch, 3 ) ); if ( ! $link ) return $m[0]; $frag = ( ( $h = strpos( $m[2], '#' ) ) !== false ) ? substr( $m[2], $h ) : ''; $pos = strpos( $m[0], $m[2] ); $re++; return substr_replace( $m[0], $link . $frag, $pos, strlen( $m[2] ) ); } return $m[0]; }, $old ); if ( $new === null || $new === $old ) continue; $posts++; if ( ! $dry ) { if ( ! get_post_meta( $id, '_zn_backup_map', true ) ) add_post_meta( $id, '_zn_backup_map', wp_slash( $old ), true ); $wpdb->update( $wpdb->posts, array( 'post_content' => $new ), array( 'ID' => $id ) ); clean_post_cache( $id ); } } $offset += count( $ids ); echo '

' . ( $dry ? 'DRY RUN: ' : '' ) . (int) $offset . ' items check hue. Is batch mein ' . $posts . ' posts, ' . $re . ' links naye page par, ' . $rm . ' links hata diye' . ( $dry ? ' (kuch save nahi hua)' : '' ) . '.

'; if ( count( $ids ) === $batch ) { $busy = true; zn_mapper_form( 'apply', $offset, 'Agla batch', true, $dry ? '' : '' ); } else { echo '

Mukammal.

'; } } if ( $busy ) { echo ''; return; } /* ---- Buttons ---- */ echo '

Step 1:

'; zn_mapper_form( 'scan', 0, 'Scan karo (broken links dhoondo)' ); $scan = get_option( 'zn_scan', array() ); if ( ! $scan ) { echo ''; return; } arsort( $scan ); $map = get_option( 'zn_map', array() ); /* ---- Review ---- */ $pool = array(); foreach ( $wpdb->get_results( "SELECT ID, post_title, post_name, post_type FROM {$wpdb->posts} WHERE post_status='publish' AND post_type IN ('post','page')" ) as $r ) { $pool[] = array( 'id' => (int) $r->ID, 'title' => $r->post_title, 'type' => $r->post_type, 'tok' => zn_tokens( $r->post_title . ' ' . $r->post_name ) ); } echo '

Step 2: Review

Har purane URL ke saamne sahi page chunein. "Abhi chhod do" ka matlab link jaisa hai waisa rahega. Jo URL kisi page se match nahi karte unhe "Link hata do" par rakhein.

'; echo '
'; wp_nonce_field( 'zn_map' ); echo ''; foreach ( $scan as $path => $n ) { $h = md5( $path ); $slug = basename( $path, '.html' ); $tok = zn_tokens( $slug ); $isP = strpos( $path, '/p/' ) === 0; $numbered = (bool) preg_match( '/_\d+\.html$/', $path ); $c = array(); foreach ( $pool as $p ) { $s = zn_score( $tok, $p['tok'] ); if ( $isP && $p['type'] === 'page' ) $s += 0.05; if ( $s > 0.15 ) $c[] = array( 's' => $s, 'p' => $p ); } usort( $c, function ( $a, $b ) { return $b['s'] <=> $a['s']; } ); $c = array_slice( $c, 0, 4 ); if ( isset( $map[ $path ] ) ) { $sel = $map[ $path ]; } elseif ( $c && ! $numbered && $c[0]['s'] >= 0.6 && ( ! isset( $c[1] ) || $c[0]['s'] - $c[1]['s'] >= 0.1 ) ) { $sel = 'id:' . $c[0]['p']['id']; } else { $sel = 'skip'; } echo ''; } echo '
Purana URLKitni baarKya karna hai
' . esc_html( $path ) . ( $numbered ? '
numbered slug: asli post andaze se nahi milega' : '' ) . '
' . (int) $n . '

'; echo '

Step 3: Articles mein lagao

Pehle Dry run, phir asli.

'; zn_mapper_form( 'apply', 0, 'Dry run (sirf check)', false, '' ); zn_mapper_form( 'apply', 0, 'Asli apply karo' ); echo ''; }

Education book 2nd year in Urdu

November 25, 2022

This is education book for 2nd year F.A part 2 Urdu medium in PDF. Download this book and enjoy reading...
Read more

2nd year psychology Urdu and English Medium PDF Download

November 25, 2022

 This is a psychology book for 2nd year to download in pdf. I have uploaded 12 class psychology book for...
Read more

2nd year chemistry book 2023 PDF Download

November 25, 2022

The textbook of chemistry for class 12 F.Sc part 2 2nd year has been uploaded here on this page. You...
Read more

2nd year arabic textbook pdf download

November 25, 2022

 Now I am going to update the list of all 2nd year book present here on Zahid Notes. Earlier this...
Read more

Sarmaya Urdu 2nd year Book PDF Punjab Board

November 25, 2022

Now the book of the 2nd year all subjects are available on this website. You can download them free from...
Read more

2nd year Pakistan studies new book 2022 PDF Download

November 25, 2022

Please download 2nd year Pakistan Studies Book in Both Urdu and English 2022 here in this page. Here I have...
Read more

2nd year roll number slip 2023 online download punjab boards

November 17, 2022

2nd year roll number slip 2023 Punjab board now search by name online. 12th class roll number slip 2023 Punjab...
Read more

2nd year economics book in Urdu PDF

November 2, 2022

2nd year economics books can be downloaded in PDF from Zahid Notes. Zahid Notes provides economics book in Urdu for...
Read more

2nd year economics notes in Urdu PDF download

November 2, 2022

2nd year Economics Notes download pdf here in Urdu. Urdu medium economics all chapters notes for class 12 are given...
Read more

Whatsapp Groups for Studens and teachers in Pakistan

June 19, 2022

 Here you can join our whatsapp groups. I have listed study groups for students in Pakistan. These are our own...
Read more
Previous Next