1. There is a small bug in the cloaking code:
offending line –
$q .= " AND '$wildcard_value' LIKE CONCAT(value, '%') ";
changed to –
$q .= " AND ( '$wildcard_value' = value OR '$wildcard_value' LIKE CONCAT(value, '.%') ) ";
Updated file located here.

2. PagerFix.php has been updated for WP 2.1.
Updated file located here.

3. Small update for Digg.php.
Updated file located here.

Copy Corrections


"For maximum efficiency … " => "To maximize success in … "
"… visual design and moving" => "… visual design as well as … "
"… development lifetime." => "lifetime."
"… XML-based sitemaps, social bookmarking widgets … " => "XML-based site maps, social bookmarking functionality … "
"Tools to create feeds …" => "Tools to create and syndicate feeds …" (xviii)

Chapter 1

"If a new feature …" => "If a feature …" (4)
"Writing copy and titles that rank well are obviously not successful if they do …" => "Writing copy and titles that rank well is obviously not successful if it does …" (4)
After "… which will be your working environment for this book." INSERT "We will add a line to your computer's host file to configure this domain." (6)
"Note that you cannot have more web servers working …" => "Note that you cannot have more than 1 web server … " (7)
On page 9, only the second line of the hosts file should be grayed. (9)
AFTER "… but you can create it anywhere else if you like" INSERT "If you do so, the DocumentRoot directive in your http-vhosts.conf file must be changed accordingly." (9)
"… are handled by Apache" => "… are handled by Apache's default directory." (9)

Chapter 2

"One must understand …" => "One must be aware of …" (15)
"This perception is encouraged …" => "This perception is affirmed …" (16)
"… known to occasionally …" => "… known to periodically …" (17)
"… discuss the most important and consistently considered …" => "… discuss the most important …" (17)
After "… (CTR)." INSERT "Certainly, it is one of the most important on-page factors." (18)
"… the same generic text …" => "the same default text …" (18)
"Anchor text is an important off-page factor …" => "Anchor text is an important external factor …" (18)
"Because these tags …" => "Because these attributes …" (21)
"… in an alt tag …" => "… in an alt attribute … " (21)
"Alt tags …" => "Alt attributes …" (21)
"Many users previously …" => "Many marketers previously …" (22)
"Over time, a web site that gradually adds content acquires …" => "Over time, a web site acquires …" (22)
"Over time, a link actually appreciates …" => "Over time, a link may appreciate …" (22)
"Usually this is an indicator of a linking …" => "Usually this is an indicator of an artificial linking … "
"Typically web analytics are used …" => "Typically web analytics are also used …" (28)

Chapter 3

After "…increases perceived relevance." => "Keywords in a URL that match a query will also be bolded or otherwise set off by major search engines." (38)
"…can get the pages penalized." => "may result in a page penalization." (39)
"…using functions to…" => "using functions (URL factories) to" (40)
"…URL rewriting and redirection, … " => "URL rewriting and redirection respectively," (41)
After "" " (1 Parameter) (43)
After "" " (2 Parameters) (43)
"This is the best approach …" => "This is often the best approach" (44)
"…end up parsing different …" => "end up spidering different" (45)
Remove sentence "Your script may recognize the equivalence of those URLs, but a search engine may not." (45)
"PHP does not have anything to do with it …" => "PHP does not have anything to do with it (beyond generating the links with our URL factory)" (47)
"… the PHP script is unaware that the initial user request was for a different URL." => "the PHP script is still driven by a dynamic URL." (47)
"Rewriting images and streams" => "Rewriting images and streaming content" (48)
"…when accessing that directory." => "when accessing that directory and directories within." (49)
"if you have live …" => "if you have other" (49)
"…an extra slash:" => "a leading slash:" (50)
"…folder contains two lines." => "folder contains two program lines." (52)
"…the PHP script is accessed…" => "the PHP script is executed" (52)
""/" => "" (52) (minor formatting here …)
"…what was the original request…" => "what the original URL of the request was" (52)
"…ignored by the parser." => "ignored by the mod_rewrite parser."
"You can even find a book dedicated to mod_rewrite, which contains lots of theory of regular expressions as well" => "You may even find entire books on mod_rewrite, including in-depth discussion of regular expressions." (54-55)
"…groups of strings…" => "strings" (55)
"productID=" => "product_id=" (55)
"…add the following rewriting rule…" => "add the following highlighted rewriting rule" (55)
ALL INSTANCES OF [0-9]* SHOULD BE CHANGED TO [0-9]+ in rewrite rules. The latter is more specific and optimized, but the former is not incorrect.
"…and the * that follows indicates that the pattern can repeat…" => "and the + that follows indicates that the pattern must occur one or more times" (58)
"The $ matches the end of the string." => "The $ matches the end of the string — the URL in this case." (58)
remove ", plugs the variables that you stored into your script URL mapping and" (58)
"productID=" => "product_id" (59)
"…one or more flag arguments." => "one or more flag arguments, delimited by commas" (59)
after "…an individual rule." INSERT "Multiple flags are delimited by commas, i.e. "[NC, L]"" (59)
"…than using preg_match." => "than using preg_match, the regular expression matching function we use." (60)
"…but all matches are searched." => "but all matches are attempted." (61)
"The function replacing…" => "Replaces" (61)
BOLD "…must be written on a single line…" (62)
"You created a rewriting rule to…" => "You created a rewriting rule in" (63)
"…is the number that" => "is the similarly defined number that" (63)
"…in the product information table that associates such beautified URLs to "real" URLs" => "in the product and category tables that associate such strings with their respective IDs." (64)
"Name/Pn" => "Name-Pn" (71) (typo)
"…takes away any additional…" => "removes any additional" (66)

Chapter 4

"Note that in case…" => "Note that in the case" (80)
"…, the response will…" => ",one will" (81)
"…page on domain A to link to…" => "page on domain A to reference" (82)
", but they do not affect the transference of link equity." => ", except that they do not effect the transference of link equity." (82)
BEFORE "It's actually fairly simple" INSERT "So what is the proper solution?" (84)
AFTER "…for things to clear up." INSERT "One could do this automatically if, for example, the database cannot be accessed." (84)
"…in production scenario…" => "in a production scenario" (89)
"…captures the entire query string…" => "captures the entire URL and query string" (90)
"" => "" (90)
"" => "" (90)
AFTER "…you to" INSERT "This rule will also work for subdirectories, i.e. gets redirected to (92)
header('Location: ' . $captures[1]); => header('Location: ' . SITE_DOMAIN . $captures[1]); (93,94)

Chapter 5

After "…the various major search engines." => "The name attribute is not case sensitive; "google" or "Google" will do." (98)
"As mentioned, two technical … " => "There are two technical" (98)
AFTER "…begins with /directory, …" => "(including, perhaps, "directory.html")" (101)
"…it could be applied." => "it could conceivably be applied." (102)
"A standard robots.txt file cannot be…" => "A standard robots.txt file cannot conveniently be" (102)
AFTER "…but it's not standard." => "The rule would look like "Disallow: /products.php*print=" (102)
"However in this case there is a solution." => "However, in this case there is a standards-based solution." (103)
AFTER "This topic was covered in Chapter 4." => "In this case it is fine, because the pages are to be excluded anyway." (103)
AFTER "does nothing to resolve this." => "For example:" (104)
"These three URLs are just duplicated as" => "are just as problematic as:" (104)
"…do not effect changes…" => "do not effect substantial changes" (105)
"…questionable link-value…" => "questionable link-equity" (105)
AFTER "…more than one site" ADD "(you would have to set up associations on a per-referring-domain basis)". (108)
"…without the affiliate information." => "without the affiliate parameters." (109)
"…mod_rewrite that represents…" => "mod_rewrite that stores" (111)
"…would still match for keyword-rich URLs that contain query string parameters…" => "still matches URLs as it did before" (111)
"In case it does…" => "In the case that it does" (111)
"…a clean product URL…" => "our generated product URL" (111)

Chapter 6

AFTER "In this perfect world" ADD ", all other ranking factors held constant." (119)
BEFORE "This chapter will teach … " ADD "Don't worry. A search engine friendly site does not mean the end of AJAX, Flash, or JavaScript. Don't run back to 1994 … yet." (119)
AFTER "Present copy as clear text, not images … " ADD "(or use one of the techniques presented in this chapter to the same end)." (120)
BEFORE "If you don't want a link … " ADD "As discussed in chapter 5," (121)
AFTER "… drop-down menus … " ADD "usually" (121)
BEFORE "err" ADD "we" (123)
Minor formatting issues with the code on page 123, 124.
Remove copy "This is the moment of truth" (126)
"" should not be dashed on page 127.
REPLACE "you can check out the" WITH "you can check out a" (130)
AFTER "This keeps both humans and robots happy." ADD "This method is not considered black hat, so long as the replacement is faithful to what it replaces." (130)
AFTER "… you can see in Figure 6-8." ADD "You may use CSS to style the text for non-JavaScript enabled users if desired." (134)
REPLACE "test.bmp" with "test.png" on page 139 (ALL OCCURENCES).
REPLACE "style tags" WITH "style attributes" (141)
AFTER "entirely identical onscreen" ADD "with the currently applied style sheets." (141)
REPLACE "won't parse your script" WITH "won't execute your script" (141)
Figure 6-11 on page 142 is missing the box around the navigation.
Figure 6-15 on page 150 should show the tabs popped out.

Chapter 8

CHANGE "… to comment links" TO "to links" (173)
CHANGE "on their forums" TO "on his forums" (177)
CHANGE "further processed by … " TO "further processed or displayed by" (177)
CHANGE "And a 301 redirect will" to "And a 301 redirect may" (194)
AFTER "the following .htaccess directives" ADD "(where is the IP address)"

Chapter 9

No edits, but the new directive in robots.txt "Sitemap:X" should be mentioned, and is mentioned in the ASP.NET ed.

Chapter 10

No edits.

Chapter 11

"which is a stated" => "which is an implied" (220)
"in this upcoming exercise you're implementing" => "In the following exercise you implement" (223)
"… verifies if the visitor" => "indicates if the visitor" (223)
"… which will have the output" => "… which will present the output" (223)
See updated cloaking code above for minor code glitch on 227

Chapter 12

We should define netblock (245)
After "" INSERT "(where is the IP address of your web server)" (245)

Chapter 13

AFTER "Add the following lines" INSERT ", where is the IP address of your web server)" (251)

Chapter 14

"… implement what relates to search engine optimization, but the…" => "implement only what relates to search engine optimization; the" (261)
"Implement the product catalog using search engine-friendly methods" => "Implement the product catalog with search engine-friendly architecture." (261)
"… is very basic, and highlights only the" => "is very basic, but highlights the" (261)
"… maximum number of products it can display, and use a paging …" => "maximum number of products they can dispay, and use a search engine-friendly paging" (262)
"… link to the storefront" => "link to the home page" (262)
"Starting from the basic list of requirements depicted earlier, you've come to implement three" => "Starting from the list of requirements enumerated above, you implement three"
"…by numerous helper => "by a few helper"
BEFORE "Please follow the geo-targeting exercise" INSERT "If you haven't already," (264)
"…take files from the code download" => "take these files from the code download" (264)
"… little bit to ensure" => "little bit to understand" (279)
"… and number of items per page" => "the number of items per page" (281)
"… is different than 1″ => "is not equal to 1″ (281)
"… when improving" => "when examining" (281)

Chapter 15

"But until then, dive" => "But until then, let's"

Chapter 16

"Disallow: /*?cat=" SHOULD READ "Disallow: /blog/*?cat="
Strictly speaking, this is not a bug, but it's a more specific exclusion.
Remove "<div class="entry">" (309).

See code updates at top of this page for updated WP plugins.

Tell an amigo:
  • Sphinn
  • Digg
  • Reddit
  • StumbleUpon
  • Facebook