Hi all,

So I launched a clients website using Wordpress and for whatever reason they seem to be encountering this issue whereby they cannot login.

The issue is baffling as no changes were made but i get this message when trying to login through wp-admin <strong>Warning: Cannot modify header information - headers already sent by</strong>.

It states the problem is coming from functions.php line 9. I have looked up and down in every file possible and right now I'm at wits end with a severely unhappy client! :(

If i use the functions.php from their old site, it displays fine but the sidebar picks up the old stylesheet coming from where I do not know!!

I have seen previous posts about a similar issue and although helpful, doesn't seem to have any effect whatsoever.

Can someone PLEASE help me solve this as after 48hrs, i'm no close to solving it.

This is the code in functions.php

<?php

if ( function_exists('register_sidebars') )

register_sidebars(3);

?>

<?php

$artThemeSettings = array(
	'menu.showSubmenus' => false

);



load_theme_textdomain('kubrick');





if (!function_exists('get_search_form')) {

	function get_search_form()

{

		include (TEMPLATEPATH . "/searchform.php");

	}

}



if (!function_exists('get_previous_posts_link')) {

	function get_previous_posts_link($label)

{

		ob_start();

		previous_posts_link($label);

		return ob_get_clean();

	}

}



if (!function_exists('get_next_posts_link')) {

	function get_next_posts_link($label)

{

		ob_start();

		next_posts_link($label);

		return ob_get_clean();

	}

}



function art_comment($comment, $args, $depth)

{

	 $GLOBALS['comment'] = $comment; ?>

   <li <?php comment_class(); ?> id="li-comment-<?php comment_ID() ?>">

     <div id="comment-<?php comment_ID(); ?>">

<div class="Post">

         <div class="Post-body">

     <div class="Post-inner article">

     

<div class="PostContent">

     

      <div class="comment-author vcard">

         <?php echo get_avatar($comment,$size='48',$default='<path_to_url>' ); ?>



         <?php printf(__('<cite class="fn">%s</cite> <span class="says">says:</span>'), get_comment_author_link()) ?>

      </div>

      <?php if ($comment->comment_approved == '0') : ?>

         <em><?php _e('Your comment is awaiting moderation.') ?></em>

         <br />

      <?php endif; ?>



      <div class="comment-meta commentmetadata"><a href="<?php echo htmlspecialchars( get_comment_link( $comment->comment_ID ) ) ?>"><?php printf(__('%1$s at %2$s'), get_comment_date(),  get_comment_time()) ?></a><?php edit_comment_link(__('(Edit)'),'  ','') ?></div>



      <?php comment_text() ?>



      <div class="reply">

         <?php comment_reply_link(array_merge( $args, array('depth' => $depth, 'max_depth' => $args['max_depth']))) ?>

      </div>



      </div>

      <div class="cleared"></div>

      



      </div>

      

          </div>

      </div>

      

     </div>

<?php

}





if (function_exists('register_sidebars')) {

	register_sidebars(2, array(

		'before_widget' => '<!--- BEGIN Widget --->',

		'before_title' => '<!--- BEGIN WidgetTitle --->',

		'after_title' => '<!--- END WidgetTitle --->',

		'after_widget' => '<!--- END Widget --->'

	));

}



function art_normalize_widget_style_tokens($content) {

	$bw = '<!--- BEGIN Widget --->';

	$bwt = '<!--- BEGIN WidgetTitle --->';

	$ewt = '<!--- END WidgetTitle --->';

	$bwc = '<!--- BEGIN WidgetContent --->';

	$ewc = '<!--- END WidgetContent --->';

	$ew = '<!--- END Widget --->';

	$result = '';

	$startBlock = 0;

	$endBlock = 0;

	while (true) {

		$startBlock = strpos($content, $bw, $endBlock);

		if (false === $startBlock) {

			$result .= substr($content, $endBlock);

			break;

		}

		$result .= substr($content, $endBlock, $startBlock - $endBlock);

		$endBlock = strpos($content, $ew, $startBlock);

		if (false === $endBlock) {

			$result .= substr($content, $endBlock);

			break;

		}

		$endBlock += strlen($ew);

		$widgetContent = substr($content, $startBlock, $endBlock - $startBlock);

		$beginTitlePos = strpos($widgetContent, $bwt);

		$endTitlePos = strpos($widgetContent, $ewt);

		if ((false == $beginTitlePos) xor (false == $endTitlePos)) {

			$widgetContent = str_replace($bwt, '', $widgetContent);

			$widgetContent = str_replace($ewt, '', $widgetContent);

		} else {

			$beginTitleText = $beginTitlePos + strlen($bwt);

			$titleContent = substr($widgetContent, $beginTitleText, $endTitlePos - $beginTitleText);

			if ('&nbsp;' == $titleContent) {

				$widgetContent = substr($widgetContent, 0, $beginTitlePos)

					. substr($widgetContent, $endTitlePos + strlen($ewt));

			}

		}

		if (false === strpos($widgetContent, $bwt)) {

			$widgetContent = str_replace($bw, $bw . $bwc, $widgetContent);

		} else {

			$widgetContent = str_replace($ewt, $ewt . $bwc, $widgetContent);

		}

		$result .= str_replace($ew, $ewc . $ew, $widgetContent);

	}

	return $result;

}



function art_sidebar($index = 1)

{

	if (!function_exists('dynamic_sidebar')) return false;

	ob_start();

	$success = dynamic_sidebar($index);

	$content = ob_get_clean();

	if (!$success) return false;

	$content = art_normalize_widget_style_tokens($content);

	$replaces = array(

		'<!--- BEGIN Widget --->' => "<div class=\"Block\">\r\n    <div class=\"Block-body\">\r\n",

		'<!--- BEGIN WidgetTitle --->' => "<div class=\"BlockHeader\">\r\n    <div class=\"header-tag-icon\">\r\n        <div class=\"BlockHeader-text\">\r\n",

		'<!--- END WidgetTitle --->' => "\r\n        </div>\r\n    </div>\r\n    <div class=\"l\"></div>\r\n    <div class=\"r\"><div></div></div>\r\n</div>\r\n",

		'<!--- BEGIN WidgetContent --->' => "<div class=\"BlockContent\">\r\n    <div class=\"BlockContent-tl\"></div>\r\n    <div class=\"BlockContent-tr\"><div></div></div>\r\n    <div class=\"BlockContent-bl\"><div></div></div>\r\n    <div class=\"BlockContent-br\"><div></div></div>\r\n    <div class=\"BlockContent-tc\"><div></div></div>\r\n    <div class=\"BlockContent-bc\"><div></div></div>\r\n    <div class=\"BlockContent-cl\"><div></div></div>\r\n    <div class=\"BlockContent-cr\"><div></div></div>\r\n    <div class=\"BlockContent-cc\"></div>\r\n    <div class=\"BlockContent-body\">\r\n",

		'<!--- END WidgetContent --->' => "\r\n    </div>\r\n</div>\r\n",

		'<!--- END Widget --->' => "\r\n    </div>\r\n</div>\r\n"

	);

	$bwt = '<!--- BEGIN WidgetTitle --->';

	$ewt = '<!--- END WidgetTitle --->';

	if ('' == $replaces[$bwt] && '' == $replaces[$ewt]) {

		$startTitle = 0;

		$endTitle = 0;

		$result = '';

		while (true) {

			$startTitle = strpos($content, $bwt, $endTitle);

			if (false == $startTitle) {

				$result .= substr($content, $endTitle);

				break;

			}

			$result .= substr($content, $endTitle, $startTitle - $endTitle);

			$endTitle = strpos($content, $ewt, $startTitle);

			if (false == $endTitle) {

				$result .= substr($content, $startTitle);

				break;

			}

			$endTitle += strlen($ewt);

		}

		$content = $result;

	}

	$content = str_replace(array_keys($replaces), array_values($replaces), $content);

	echo $content;

	return true;

}



function art_list_pages_filter($output)

{

	$output = preg_replace('~<li([^>]*)><a([^>]*)>([^<]*)</a>~',

		'<li$1><a$2><span><span>$3</span></span></a>',

		$output);

	$re = '~<li class="([^"]*)(?: current_page_(?:ancestor|item|parent))+([^"]*)"><a ~';

	$output = preg_replace($re, '<li class="$1$2"><a class="active" ', $output, 1);

	$output = preg_replace($re, '<li class="$1$2"><a ', $output);

	return $output;

}



function art_header_page_list_filter($pages)

{

	global $artThemeSettings;

	$result = array();

	if ($artThemeSettings['menu.showSubmenus']) {

		foreach ($pages as $page)

			$result[] = $page;

	} else {

		foreach ($pages as $page)

			if (0 == $page->post_parent)

				$result[] = $page;

	}

	if ('page' == get_option('show_on_front')) {

		$pageOnFront = get_option('page_on_front');

		$pageForPosts = get_option('page_for_posts');

		if ($pageOnFront) {

			foreach ($result as $key => $page) {

				if (0 == $page->post_parent && $pageOnFront == $page->ID) {

					unset($result[$key]);

					break;

				}

			}

		}

		if (!$pageOnFront && $pageForPosts) {

			foreach ($result as $key => $page) {

				if (0 == $page->post_parent && $pageForPosts == $page->ID) {

					unset($result[$key]);

					break;

				}

			}

		}

	}

	return $result;

}



function art_menu_items()

{

	$homeMenuItemCaption = <<<EOD

Home

EOD;

    $showHomeMenuItem = true;   

	$isHomeSelected = null;

	if ('page' == get_option('show_on_front')) {

		$pageOnFront = get_option('page_on_front');

		$pageForPosts = get_option('page_for_posts');

		if ($pageOnFront) {

			$page = & get_post($pageOnFront);

			if (null != $page)

				$homeMenuItemCaption = apply_filters('the_title', $page->post_title);

			$isHomeSelected = is_page($page->ID);

		} elseif (!$pageOnFront && $pageForPosts) {

			$page = & get_post($pageForPosts);

			if (null != $page)

				$homeMenuItemCaption = apply_filters('the_title', $page->post_title);

		}

	}

	if (null === $isHomeSelected)

		$isHomeSelected = is_home();

    if (true === $showHomeMenuItem || 'page' == get_option('show_on_front'))

	echo '<li><a' . ($isHomeSelected ? ' class="active"' : '') . ' href="' . get_option('home') . '"><span><span>'

		. $homeMenuItemCaption . '</span></span></a></li>';

	add_action('get_pages', 'art_header_page_list_filter');

	add_action('wp_list_pages', 'art_list_pages_filter');

	wp_list_pages('title_li=');

	remove_action('wp_list_pages', 'art_list_pages_filter');

	remove_action('get_pages', 'art_header_page_list_filter');

}



add_filter('comments_template', 'legacy_comments');  

function legacy_comments($file) {  

    if(!function_exists('wp_list_comments')) : // WP 2.7-only check  

    $file = TEMPLATEPATH.'/legacy.comments.php';  

    endif;  

    return $file;  

} 

add_theme_support( 'menus' );
?>

Dani AI

Generated

As already spotted, the immediate cause is output being sent from the theme before WordPress can send headers. A stray PHP close/open pair or invisible characters (BOM or trailing whitespace) will emit a newline and break header-based actions: cookies, redirects and the wp-admin login flow. The error message pointing to functions.php line 9 is the key — that line is where the first output was produced.

A practical checklist to resolve and verify:

  • Consolidate the PHP blocks: keep a single <?php at the top of a PHP-only theme file and avoid closing/ reopening tags that introduce blank lines. Example of the recommended pattern:

    <?php
    // functions.php - PHP only. Omit the closing '?>' at the end.
  • Check file encoding: convert functions.php (and wp-config.php, header.php, included files) to "UTF-8 without BOM" — many editors show encoding (Notepad++, Sublime, VSCode). BOM bytes at the start appear as invisible output and commonly cause this error.

  • Inspect for stray whitespace before <?php or after ?> in all included files. The error message shows the originating file/line; open that file and examine characters before the reported line.

  • Quick recovery if wp-admin is inaccessible: via FTP/SSH rename the active theme folder (forces WP to fall back to a default theme) or temporarily rename the plugins folder to disable plugins. This restores admin access while debugging.

  • Temporary workaround only: start output buffering early (for example, ob_start(); at the very top of wp-config.php) to mask the symptom — not a substitute for removing the root cause.

Regarding the old functions.php that made the sidebar pick up an old stylesheet: that older file likely contains a hard-coded stylesheet URL or enqueues a stylesheet from the old location. Search the theme files for hard-coded URLs or calls that build absolute stylesheet paths, clear any caching (WP cache plugins, server cache, browser cache) and verify after the whitespace/BOM fix.

Well this functions.php file prints a new line at lines 7 to 9

?>

<?php

And you probably know that printing requires the headers to be sent so you can't change them anymore after printing.

Try removing these 3 lines.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.