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 '
';
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 '';
}
}
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 '';
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 '';
}
Skip to content
I have previously published many essays for 2nd year with quotations on this blog. Those are individual essays and every post has one essay in text form.
The students could not download all the essays together in a single pdf file.
Many students then commented and asked me to publish essays in pdf. Now I have compiled a pdf file consisting of 14 essays that are important in the annual exams 2024.