I have a Glossary CPT. Title, editor, slug and featured image.
I would like to add a filter to Post content (and content of my other CPT "species") which looks through all of the content in each post and replaces any words found in the Glossary with a link to the glossary entry.
For example...
Glossary entry: test
Post content: <p>This is a test post to explain what I mean.</p>
Outcome after filter: <p>This is a <a href="/glossary/t/test/">test</a> post to explain what I mean.</p>.
There may be up to 2000 glossary entries at any given time however, so I'm worried about efficiency.
EDIT: THIS CODE NEEDS SOME REWORKING!
I've started to use code as suggested by Matthew Boynes.
I have adapted it somewhat, as I was receiving an error with my $wordlist variable.
More information on said error is available here.
function add_glossary_links($content) {
global $wpdb, $wordlist;
if ( !$wordlist && !$wordlist = get_option('wordlist') ) {
mysql_query('SET SESSION group_concat_max_len = 100000');
$wordlist = $wpdb->get_var('SELECT GROUP_CONCAT(DISTINCT post_title SEPARATOR "|") AS list FROM '.$wpdb->posts.' WHERE post_status="publish" AND post_type="glossary" AND post_parent>0');
add_option('wordlist', $wordlist);
}
$wordlist = str_replace(array(" ", "'", ".", "/"), array("\s", "\'", "\.", "\/"), $wordlist);
$content = preg_replace_callback(
'/\b('.$wordlist.')\b/i',
create_function(
'$matches',
'return "<a href=\"/glossary/" . strtolower(substr($matches[0],0,1) . "/" . $matches[0]) . "/\">" . $matches[0] . "</a>";'
),
$content
);
return preg_replace('/(<[^<]+)<a\s.*?>(.*?)<\/a>/si','$1$2', $content);
}
add_filter( 'the_content', 'add_glossary_links' );
The function above works, to an extent. I now have two issues:
The function is linking everything:
[<a href="/glossary///"></a>caption <a href="/glossary///"></a>id="<a href="/glossary///"></a>attachment_542" <a href="/glossary///"></a>align="<a href="/glossary///"></a>alignleft" <a href="/glossary///"></a>width="<a href="/glossary///"></a>125" <a href="/glossary///"></a>caption="<a href="/glossary///"></a>Amazonas <a href="/glossary///"></a>Magazine - <a href="/glossary///"></a>now <a href="/glossary///"></a>in <a href="/glossary///"></a>English!"]<<a href="/glossary///"></a>a <a href="/glossary///"></a>href="<a href="/glossary///"></a>http://<a href="/glossary///"></a>www.<a href="/glossary///"></a>seriouslyfish.<a href="/glossary///"></a>com/<a href="/glossary///"></a>dev/<a href="/glossary///"></a>wp-<a href="/glossary///"></a>content/<a href="/glossary///"></a>uploads/<a href="/glossary///"></a>2011/<a href="/glossary///"></a>12/<a href="/glossary///"></a>Amazonas-<a href="/glossary///"></a>English-<a href="/glossary///"></a>1.<a href="/glossary///"></a>jpg"><<a href="/glossary///"></a>img <a href="/glossary///"></a>class="<a href="/glossary///"></a>size-<a href="/glossary///"></a>thumbnail <a href="/glossary///"></a>wp-<a href="/glossary///"></a>image-<a href="/glossary///"></a>542" <a href="/glossary///"></a>title="<a href="/glossary///"></a>Amazonas <a href="/glossary///"></a>English" <a href="/glossary///"></a>src="<a href="/glossary///"></a>http://<a href="/glossary///"></a>www.<a href="/glossary///"></a>seriouslyfish.<a href="/glossary///"></a>com/<a href="/glossary///"></a>dev/<a href="/glossary///"></a>wp-<a href="/glossary///"></a>content/<a href="/glossary///"></a>uploads/<a href="/glossary///"></a>2011/<a href="/glossary///"></a>12/<a href="/glossary///"></a>Amazonas-<a href="/glossary///"></a>English-<a href="/glossary///"></a>1-<a href="/glossary///"></a>288x381.<a href="/glossary///"></a>jpg" <a href="/glossary///"></a>alt="<a href="/glossary///"></a>Amazonas <a href="/glossary///"></a>English" <a href="/glossary///"></a>width="<a href="/glossary///"></a>125" <a href="/glossary///"></a>height="<a href="/glossary///"></a>165" /></a<a href="/glossary///"></a>>[/caption<a href="/glossary///"></a>] <<a href="/glossary///"></a>p><a href="/glossary///"></a>Edited <a href="/glossary///"></a>by <a href="/glossary///"></a>Hans-<a href="/glossary///"></a>Georg <a href="/glossary///"></a>Evers, <a href="/glossary///"></a>the <a href="/glossary///"></a>magazine &#<a href="/glossary///"></a>8216;<a href="/glossary///"></a>Amazonas&#<a href="/glossary///"></a>8217; <a href="/glossary///"></a>has <a href="/glossary///"></a>been <a href="/glossary///"></a>widely-<a href="/glossary///"></a>regarded <a href="/glossary///"></a>as <a href="/glossary///"></a>among <a href="/glossary///"></a>the <a href="/glossary///"></a>finest <a href="/glossary///"></a>regular <a href="/glossary///"></a>publications <a href="/glossary///"></a>in <a href="/glossary///"></a>the <a href="/glossary///"></a>hobby <a href="/glossary///"></a>since <a href="/glossary///"></a>its <a href="/glossary///"></a>launch <a href="/glossary///"></a>in <a href="/glossary///"></a>2005, <a href="/glossary///"></a>an <a href="/glossary///"></a>impressive <a href="/glossary///"></a>achievment <a href="/glossary///"></a>considering <a href="/glossary///"></a>it&#<a href="/glossary///"></a>8217;<a href="/glossary///"></a>s <a href="/glossary///"></a>only <a href="/glossary///"></a>been <a href="/glossary///"></a>published <a href="/glossary///"></a>in <a href="/glossary///"></a>German <a href="/glossary///"></a>to <a href="/glossary///"></a>date. <a href="/glossary///"></a>The <a href="/glossary///"></a>long-<a href="/glossary///"></a>awaited <a href="/glossary///"></a>English <a href="/glossary///"></a>version <a href="/glossary///"></a>is <a href="/glossary///"></a>just <a href="/glossary///"></a>about <a href="/glossary///"></a>to <a href="/glossary///"></a>launch, <a href="/glossary///"></a>and <a href="/glossary///"></a>we <a href="/glossary///"></a>think <a href="/glossary///"></a>a <a href="/glossary///"></a>subscription <a href="/glossary///"></a>should <a href="/glossary///"></a>be <a href="/glossary///"></a>top <a href="/glossary///"></a>of <a href="/glossary///"></a>any <a href="/glossary///"></a>serious <a href="/glossary///"></a>fishkeeper&#<a href="/glossary///"></a>8217;<a href="/glossary///"></a>s <a href="/glossary///"></a>Xmas <a href="/glossary///"></a>list&#<a href="/glossary///"></a>8230;</p<a href="/glossary///"></a>> <<a href="/glossary///"></a>p><a href="/glossary///"></a>The <a href="/glossary///"></a>magazine <a href="/glossary///"></a>is <a href="/glossary///"></a>published <a href="/glossary///"></a>in <a href="/glossary///"></a>a <a href="/glossary///"></a>bi-<a href="/glossary///"></a>monthly <a href="/glossary///"></a>basis <a href="/glossary///"></a>and <a href="/glossary///"></a>the <a href="/glossary///"></a>English <a href="/glossary///"></a>version <a href="/glossary///"></a>launches <a href="/glossary///"></a>with <a href="/glossary///"></a>the <a href="/glossary///"></a>January/<a href="/glossary///"></a>February <a href="/glossary///"></a>2012 <a href="/glossary///"></a>issue <a href="/glossary///"></a>with <a href="/glossary///"></a>distributors <a href="/glossary///"></a>already <a href="/glossary///"></a>organised <a href="/glossary///"></a>in <a href="/glossary///"></a>the <a href="/glossary///"></a>United <a href="/glossary///"></a>States, <a href="/glossary///"></a>Canada, <a href="/glossary///"></a>the <a href="/glossary///"></a>United <a href="/glossary/k/kingdom/">Kingdom</a>, <a href="/glossary///"></a>South <a href="/glossary///"></a>Africa, <a href="/glossary///"></a>Australia, <a href="/glossary///"></a>and <a href="/glossary///"></a>New <a href="/glossary///"></a>Zealand. <a href="/glossary///"></a>There <a href="/glossary///"></a>are <a href="/glossary///"></a>also <a href="/glossary///"></a>mobile <a href="/glossary///"></a>apps <a href="/glossary///"></a>availablen <a href="/glossary///"></a>which <a href="/glossary///"></a>allow <a href="/glossary///"></a>digital <a href="/glossary///"></a>subscribers <a href="/glossary///"></a>to <a href="/glossary///"></a>read <a href="/glossary///"></a>on <a href="/glossary///"></a>portable <a href="/glossary///"></a>devices.</p<a href="/glossary///"></a>> <<a href="/glossary///"></a>p><a href="/glossary///"></a>It&#<a href="/glossary///"></a>8217;<a href="/glossary///"></a>s <a href="/glossary///"></a>fair <a href="/glossary///"></a>to <a href="/glossary///"></a>say <a href="/glossary///"></a>that <a href="/glossary///"></a>there <a href="/glossary///"></a>currently <a href="/glossary///"></a>exists <a href="/glossary///"></a>no <a href="/glossary///"></a>better <a href="/glossary///"></a>publication <a href="/glossary///"></a>for <a href="/glossary///"></a>dedicated <a href="/glossary///"></a>hobbyists <a href="/glossary///"></a>with <a href="/glossary///"></a>each <a href="/glossary///"></a>issue <a href="/glossary///"></a>featuring <a href="/glossary///"></a>cutting-<a href="/glossary///"></a>edge <a href="/glossary///"></a>articles <a href="/glossary///"></a>on <a href="/glossary///"></a>fishes, <a href="/glossary///"></a>invertebrates, <a href="/glossary/a/aquatic/">aquatic</a> <a href="/glossary///"></a>plants, <a href="/glossary///"></a>field <a href="/glossary///"></a>trips <a href="/glossary///"></a>to <a href="/glossary///"></a>tropical<a href="/glossary///"></a> destinations<a href="/glossary///"></a> plus<a href="/glossary///"></a> the<a href="/glossary///"></a> latest<a href="/glossary///"></a> in<a href="/glossary///"></a> husbandry<a href="/glossary///"></a> and<a href="/glossary///"></a> breeding<a href="/glossary///"></a> breakthroughs<a href="/glossary///"></a> by<a href="/glossary///"></a> expert<a href="/glossary///"></a> aquarists<a href="/glossary///"></a>, all<a href="/glossary///"></a> accompanied<a href="/glossary///"></a> by<a href="/glossary///"></a> excellent<a href="/glossary///"></a> photography<a href="/glossary///"></a> throughout<a href="/glossary///"></a>.</p<a href="/glossary///"></a>> <<a href="/glossary///"></a>p><a href="/glossary///"></a>U.<a href="/glossary///"></a>S. <a href="/glossary///"></a>residents <a href="/glossary///"></a>can <a href="/glossary///"></a>subscribe <a href="/glossary///"></a>to <a href="/glossary///"></a>the <a href="/glossary///"></a>printed <a href="/glossary///"></a>edition <a href="/glossary///"></a>for <a href="/glossary///"></a>just $<a href="/glossary///"></a>29 <a href="/glossary///"></a>USD <a href="/glossary///"></a>per <a href="/glossary///"></a>year, <a href="/glossary///"></a>which <a href="/glossary///"></a>also <a href="/glossary///"></a>includes <a href="/glossary///"></a>a <a href="/glossary///"></a>free <a href="/glossary///"></a>digital <a href="/glossary///"></a>subscription, <a href="/glossary///"></a>with <a href="/glossary///"></a>the <a href="/glossary///"></a>same <a href="/glossary///"></a>offer <a href="/glossary///"></a>available <a href="/glossary///"></a>to <a href="/glossary///"></a>Canadian <a href="/glossary///"></a>readers <a href="/glossary///"></a>for $<a href="/glossary///"></a>41 <a href="/glossary///"></a>USD <a href="/glossary///"></a>or <a href="/glossary///"></a>overseas <a href="/glossary///"></a>subscribers <a href="/glossary///"></a>for $<a href="/glossary///"></a>49 <a href="/glossary///"></a>USD. <a href="/glossary///"></a>Please <a href="/glossary///"></a>see <a href="/glossary///"></a>the <<a href="/glossary///"></a>a <a href="/glossary///"></a>href="<a href="/glossary///"></a>http://<a href="/glossary///"></a>www.<a href="/glossary///"></a>amazonasmagazine.<a href="/glossary///"></a>com/"><a href="/glossary///"></a>Amazonas <a href="/glossary///"></a>website</a<a href="/glossary///"></a>> for<a href="/glossary///"></a> further<a href="/glossary///"></a> information<a href="/glossary///"></a> and<a href="/glossary///"></a> a<a href="/glossary///"></a> sample<a href="/glossary///"></a> digital<a href="/glossary///"></a> issue<a href="/glossary///"></a>!</p<a href="/glossary///"></a>> <<a href="/glossary///"></a>p><a href="/glossary///"></a>Alternatively, <a href="/glossary///"></a>subscribe <a href="/glossary///"></a>directly <a href="/glossary///"></a>to <a href="/glossary///"></a>the <a href="/glossary///"></a>print <a href="/glossary///"></a>version <<a href="/glossary///"></a>a <a href="/glossary///"></a>href="<a href="/glossary///"></a>https://<a href="/glossary///"></a>www.<a href="/glossary///"></a>amazonascustomerservice.<a href="/glossary///"></a>com/<a href="/glossary///"></a>subscribe/<a href="/glossary///"></a>index2.<a href="/glossary///"></a>php"><a href="/glossary///"></a>here</a<a href="/glossary///"></a>> or<a href="/glossary///"></a> digital<a href="/glossary///"></a> version<a href="/glossary///"></a> <<a href="/glossary///"></a>a <a href="/glossary///"></a>href="<a href="/glossary///"></a>https://<a href="/glossary///"></a>www.<a href="/glossary///"></a>amazonascustomerservice.<a href="/glossary///"></a>com/<a href="/glossary///"></a>subscribe/<a href="/glossary///"></a>digital.<a href="/glossary///"></a>php"><a href="/glossary///"></a>here</a<a href="/glossary///"></a>>.</p<a href="/glossary///"></a>>This may be a pushing my luck, but would it be possible to make this code case-sensitive, i.e. content only matches wordlist if case is the same, unless it's the first word of a sentence?
Thanks in advance,
lowercasethenpreg_replace. In addition, the slugs will always be the lowercase version of the title with hyphens replacing spaces and apostrophes being removed. I'm happy to do AJAX calls to the description etc. but obviously something needs to be loaded in the first place to determine whether or not the content is using glossary terms. – dunc Feb 11 '12 at 15:53