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
Why I Love Pakistan Essay with quotations and outline
November 20, 2022
Zahid Notes has published an essay on Why I Love Pakistan with quotations and outlines. This essay has been written...
Read more
12 English tenses pdf in Urdu sheet download
November 1, 2022
Here are all 12 English tenses pdf sheet downloadd here in Urdu with examples. 12 tensese in Urdu pdf free...
Read more
10th class English Complete Notes PDF Download
October 27, 2022
English notes for 10th class pdf are published here on this page. These notes are in pdf and free to...
Read more
10th class English essays short notes pdf download
October 27, 2022
Here I have placed a pdf file containing all-important English essays for class 10. The students of 10th class can...
Read more
10th class English Direct indirect Notes pdf download
October 27, 2022
Here I have explained the Direct and Indirect speech rules with exercises and answers in Urdu. You can download these...
Read more
Multi topic Letter to Editor example and format for BA English
June 2, 2022
This an example of how you will write a letter to the editor for BA English. Associate degree in arts...
Read more
The feed poem explanation of all stanza
January 29, 2022
Here is the explanation of all stanzas of the poem The feed written by Ahmad Nadeem Qasmi. Stanza 1, stanza...
Read more
Chapter wise, Halfbook and Full book tests 9th class
January 28, 2022
Here are complete tests of 9th class all subjects in pdf. You can download the test session free of costs...
Read more
The feed Poem Summary 1st year English
January 12, 2022
This is the summary of the poem the Feed written by Ahmed Nadeem Qasmi. Qasmi is known for his thought-provoking...
Read more
An essay on drug addiction with outline and quotations
October 30, 2021
2nd year. FSc part 2, ICS part 2, FA part 2 and BA students can see this excellent essay on...
Read more