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 ''; }

9th class ikhlaqiat (ethics) notes pdf download

September 7, 2025

 9th class Ikhlaqiat notes in Urdu download pdf here. 9th class wthics notes in Urdu are for Punjab Board. Ikhlaqiat...
Read more

9th class All Subjects Notes PDF Download

September 7, 2025

This page has the link to 9th class pdf notes of all subjects. You can download PDF notes of all...
Read more

Computer science and entrepreneurship notes pdf download

September 7, 2025

Computer Science and Entrepreneurship Notes Class 9 PDF Download. Download Computer Science and Entrepreneurship notes for Class 9 in English...
Read more

9th class new syllabus 2025 all subjects PDF Download

September 5, 2025

 9th class new syllabus 2025 is given below. 9th class all subjects new syllabus 2025 download PDF. 9th class new...
Read more

9th class agriculture science book pdf download

August 31, 2025

 9th class Agriculture Science book pdf download here. 9th class Agriculture Sciences book 2025 download for Punjab Board. Download 9th...
Read more

FBISE SSC total marks and syllabus 2025

August 31, 2025

 This post explains the total marks of class IX and X SSC part 1 and part 2 for federal board...
Read more

9th class general science Tech book pdf download

August 30, 2025

 You can download 9th class General Science (Tech) book 2025 here. The 9th class new general science book is available...
Read more

9th class health science book 2025 pdf download

August 29, 2025

 9th class health science book pdf download here. Download 9th class health sciences new book 2025 for Punjab Board. 9th...
Read more

9th and 10th general science book pdf download

August 29, 2025

This is the general science book of 9th and 10th class for all Punjab boards. You can download the book...
Read more

9th class chemistry new book 2025 pdf download

August 29, 2025

9th class chemistry new book 2025 download in pdf here. 9th class new chemistry book for Punjab boards is available...
Read more
Previous Next