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
Many people are confused about the business letters and personal letters. The difference lies between their structure and language. Students are asked to write a letter in exams. Professionals write business letters. All of us, in fact, have to write to others in one or the other way. Although Emails are taking place the letters, yet letter writing is no outdated thing. Individuals, institutions, business firms, companies and offices write letters for various purposes.
In this post, I am going to explain the difference between formal and informal letters. (OR business and personal letters)
Business letters
They are written to an individual, an authority, an office, an institution, or a company
They are written for business purposes
Their language is formal and professional – not casual
They are strictly relevant to the purpose they are written for – they do not include irrelevant details
They are specific, brief and error free
Personal Letters
They are written to friends, family, relatives and acquaintances
They are written for exchange of information, messages, and thoughts
Their language is informal, casual, and conversational
They may include other details than the purpose they are written for
They may include extra details, expressions of feelings etc
There is not much difference between the structure of the both types of letters. Here is how business letters differ from personal letters.
Both types of letters follow the following structure
(adsbygoogle = window.adsbygoogle || []).push({});
1- (Heading)
space
2- (Name, designation and address of receiver)
space
3- (Subject / topic of letter)
space
4- (Greetings/salutation)
5- (Body of letter)
6- (Complimentary close)
space
7- (Name and designation of sender)
Important Note:
Heading: includes the name, and the address of sender
Part No. 2 (name and address of receiver) is not included in personal letter because the sender already know the address of receiver
Part No. 3 (subject/topic of letter) is not included in personal letters. It is only for business letters
The salutations may be different for business and personal letters
The complimentary close may be different for business and personal letters
Name and designation of sender is for business letters – only name is enough in personal letters
You should also read:
(adsbygoogle = window.adsbygoogle || []).push({});