Home > Plugins > Delink Pages plugin – review

Delink Pages plugin – review

Plugins

Recently I found Delink Pages 1.0 plugin by Jennifer Stuart. It promises something I was looking for:

This plugin will allow you to specify certain pages to not be linked when wp_list_pages() is used in a theme. You might want to do this if you want a header for a series of subpages, but don’t specifically want that header to be a real page itself.

Instruction says:

To indicate that a page should not be linked when wp_list_pages() is used, edit the page that you do not want linked and create a custom field with a key of “delink” and value of “true”.

Simple. Unfortunately it doesn’t work. Below is the source code:

<?php
add_filter('wp_list_pages', 'scripty_de_link');

function scripty_de_link($output) {
		$allpageids = get_posts(array('post_type' => 'page', 'numberposts' => -1));
		foreach ($allpageids as $eachpage) {
			//get custom field value for delink
			$delinkthis = get_post_meta($eachpage->ID, "delink");
			if ($delinkthis) {
				$newurl = preg_quote(get_permalink($eachpage->ID));
				$output = preg_replace('@\<a href="'.$newurl.'" (.*?)>(.*?)\<\/a>@i', '$2', $output);
			}
		}
        return $output;
}
?>

So, what’s wrong with this code? Apparently, parameters of preg_replace function are incorrect. I’m too old and too lazy to analyze the regular expression being used. Don’t get me wrong. I love regular expressions but I wouldn’t use them if there is a simpler solution. By adding one function ( str_replace_count ) and changing two lines of the original code I made it to serve my purpose. The new code follows:

<?php
add_filter('wp_list_pages', 'scripty_de_link');

function str_replace_count($find,$replace,$subject,$count)
{
   $subjectnew = $subject;
   $pos = strpos($subject,$find);
   if ($pos !== FALSE)
   {
     while ($pos !== FALSE)
     {
         $nC = $nC + 1;
         $temp = substr($subjectnew,$pos+strlen($find));
         $subjectnew = substr($subjectnew,0,$pos) . $replace . $temp;
         if ($nC >= $count)
         {
           break;
         }
         $pos = strpos($subjectnew,$find);
     } // closes the while loop
   } // closes the if
   return $subjectnew;
}

function scripty_de_link($output) {
		$allpageids = get_posts(array('post_type' => 'page', 'numberposts' => -1));
		foreach ($allpageids as $eachpage) {
			//get custom field value for delink
			$delinkthis = get_post_meta($eachpage->ID, "delink");
			if ($delinkthis) {
				$newurl = get_permalink($eachpage->ID);
				$output = str_replace_count($newurl, '#', $output, 1);
			}
		}
        return $output;
}
?>

It does not strip the page link entirely but replaces it with href=”#” which causes no action when you click on it. You can see it implemented in one of my websites – synagoguefund.com. Top navigation bar was constructed with wp_list_pages. Three pages – History, Videos, and Donations are dummy pages acting as parents to meaningfull subpages.

Categories: Plugins Tags: ,
  1. October 19th, 2009 at 22:37 | #1

    Hi Frank, I left you a comment on my site as well – I think you misunderstood the purpose of the plugin. My original intention was not to leave the text linked with href=”#” – it was to REMOVE the A (link) tag *entirely*… so it does work – but maybe not for the purpose you needed it. :)

    However, it would make sense to make your addition an option. ie. Leave it up to the user to either have the link be removed entirely (no A tag at all) – or just remove the value of the href and have it replaced with “#”…

  2. October 20th, 2009 at 15:00 | #2

    Hi Jennifer. What I meant saying that plugin didn’t work is that it leaves output from wp_list_pages unchanged in any way. It applies to both versions 1.0 and 1.1. When I used standard string functions instead of preg_quote and preg_replace the plugin made intended changes ( delink,true – stripped link entirely, delink,href – made ‘href=”#”‘ change with no problem).

  1. No trackbacks yet.