Site logo

Archived topic

Problems when trying to to build a hook

3 replies · Started by eduard sans on November 1, 2021

Viewing posts 1–4 of 4

Hi there!

Ok, so I've been working for the last hours building a PHP "Frankenstein" (copying / pasting / editing code I find) in the shape of a dynamic table of content. It is already looking good and functional but I've been doing it in the functions.php file and I'd like to place it as a hook but the moment I place the code and hit publish it just won't work.

Any ideas would be appreciated. Thanks!

Here's the code:

function insert_table_of_contents($content) {

	$html_comment = "<!--insert-toc-->";
	$comment_found = strpos($content, $html_comment) ? true : false;
	$fixed_location = true;

	// return the $content if
	// $comment_found and $fixed_location are false
	if (!$fixed_location && !$comment_found) {
		return $content;
	}

	// exclude the table of contents from all pages
	// other exclusion options include:
	// in_category($id)
	// has_term($term_name)
	// is_single($array)
	// is_author($id)
    if (is_page()) {
        return $content;
    }
		
	$regex = "~(<h([2-3]))(.*?>(.*)<\/h[2-3]>)~";
	preg_match_all($regex, $content, $heading_results);

	$num_match = count($heading_results[0]);
	if($num_match < 3) {
		return $content;
	}

	// declare local variable
	$link_list = "";
	// loop through $heading_results
	for ($i = 0; $i < $num_match; ++ $i) {
	    $new_heading = $heading_results[1][$i] . " id='$i' " . $heading_results[3][$i];
	    $old_heading = $heading_results[0][$i];
		$content = str_replace($old_heading, $new_heading, $content);
	    $link_list .= "<li class='heading-level-" . $heading_results[2][$i] .
	    	"'><a href='#$i'>" . $heading_results[4][$i] . "</a></li>";
	}
	    
	$start_nav = "<nav class='tabla-de-contenidos'>";
	$end_nav = "</nav>";
	$title = "<details><summary>Índice de contenidos:<span>[ mostrar ]</span></summary>";
	$link_list = "<ul>" . $link_list . "</ul></details>";

	$table_of_contents = $start_nav . $title . $link_list . $end_nav;

	// if $fixed_location is true and
	// $comment_found is false
	// insert the table of contents at a fixed location
	if($fixed_location && !$comment_found) {
		$first_paragraph = strpos($content, '</p>', 0) + 4;
		$second_paragraph = strpos($content, '</p>', $first_p_pos);
	return substr_replace($content, $table_of_contents, $second_paragraph + 4 , 0);
	}
	else {
		return str_replace($html_comment, $table_of_contents, $content);
	}
} 

add_filter('the_content', 'insert_table_of_contents');

Hi there,

that kind of function cannot be added to a Hook Element.
Hook elements are designed for adding 'content' into the core Hooks or the Theme content.

Your code is using an add_filter to the_content - which needs to go in your functions.php ( child theme )

Oh ok, nevermind then :). Good to know! Thanks!

You're welcome

This archived topic is closed to new replies.