• I got an email today from Joe Marchesano requesting some assistance with putting a thumbnail into the excerpt that I had previously created here. Upon looking at that previous post I realized that I never got any email regarding anyone posting anything so I apologize for not responding. However, here are some quick answers to that before I put the rest of the new code:

    vyasritesh – Not sure why it’s not working. The updated version I made works for me, although it strips out the html formatting. Working on a fix, but I wouldn’t wait around for it since it’s taking longer to figure out why it’s stripping it than I care to work on this.

    hodzic.kenan – The reason it shows 19/26 is because there are categories that don’t have posts in them. If you go to the Category Page settings and set Show empty categories to yes, you’ll see all the categories correctly.

    triez – I have the same problem. It has to do with the way the plugin was originally written. It says you can do more than one per page, but you can’t. Part of it is because it’s grabbing the content dynamically. Something that’d be nice to work on, but I just don’t have the time.

    Here’s the updated version. What’s new:

    • added option to control excerpt length
    • added an option to include post-thumbnails
    • changed version number to 2.6.1
    • added an option to choose a class for the images for the posts thumbnails
    • changed version number to 2.6.1

    So here’s the new code – simply copy the entire piece of code and paste it into your page2cat.php file:

    <?php
    /*
    Plugin Name: Category Page
    Plugin URI: https://pixline.net/wordpress-plugins/category-page-wordpress-plugin/en/
    Description: Use pages as category archive header, or list some posts from a category into a post/page.
    Author: Pixline
    Version: 2.6.1
    Author URI: https://pixline.net/
    
    Copyright (C) 2008 Paolo Tresso / Pixline (https://pixline.net/)
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    
    -----------------------------------------
    Revisions for excerpts and full posts done by John P. Neumann ([email protected])
    
    - As a note: I did not release this as a new plugin because I did not want to support it. I appreciate the feedback and questions, but please remember that I'm broke, unemployed, have a wife, 2 kids and a dog and I do this to help support the community.
    
    @TODO:
    * Add pagination
    * Add option to control image size
    
    New revisions
    
    * added option to control excerpt length
    * added an option to include post-thumbnails
    * added an option to choose a class for the header h2 that's output
    * added an option to choose a class for the images for the posts thumbnails
    * changed version number to 2.6.1
    
    List of Revisions
    
    * added 2 rows to the database named p2c_post_settings and p2c_excerpt_settings
    * added options to admin page for posts and excerpts
    * added code for both posts and settings to be available (although not at the same time)
    * added additional code for settings to be available
    * added the functionality
    * added code to disable both excerpts and posts if they are both checked since that would be stupid
    
    */
    if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You are not allowed to call this page directly.'); }
    
    define("PAGE2CAT_VERSION","2.6.1");
    define("PLUGIN_PATH",get_bloginfo('url')."/wp-content/plugins/page2cat/");
    
    define('PIXLINE_FOOTER','<p><hr style="margin-top:50px;height:1px;background:#CCC;border:0px;clear:both;" />
    <strong>
    <a href="https://pixline.net/wordpress-plugins/category-page-wordpress-plugin/en/">Category Page</a></strong> plugin
    <small> |
    <a href="https://talks.pixline.net/forum.php?id=3">Support Forum</a> |
    GPL2&copy; &ge; 2007 <a href="https://pixline.net/about/en/">Paolo Tresso / Pixline</a> |
    If you like this plugin, support its development with a <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=paolo%40pixline%2enet&item_name=Support%20to%20opensource%20projects%20at%20Pixline&no_shipping=1&cn=Something%20to%20say%3f&tax=0&currency_code=EUR&lc=IT&bn=PP%2dDonationsBF&charset=UTF%2d8">small donation</a>.</p>');
    
    $wpdb->page2cat	= $table_prefix . 'page2cat';
    
    ######################################################
    # check version. #
    ######################################################
    
    $p2c_version = get_option('pixline_page2cat_version');
    	register_activation_hook(__FILE__, 'page2cat_install');
    
    // DB installation. usually happen just one time.
    function page2cat_install(){
    global $wpdb, $p2c_version;
    
    if ($version < 6):
    	$query = "
    	CREATE TABLE  <code>&quot;.$wpdb->prefix.&quot;page2cat</code> (
    	 <code>rel_ID</code> BIGINT NOT NULL AUTO_INCREMENT ,
    	 <code>page_ID</code> BIGINT NOT NULL ,
    	 <code>cat_ID</code> BIGINT NOT NULL ,
    	PRIMARY KEY (  <code>rel_ID</code> ) ,
    	INDEX (  <code>page_ID</code> ,  <code>cat_ID</code> )
    	);
    	";
    
    	if(is_file(ABSPATH . 'wp-admin/includes/upgrade.php')){
    		require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    	}elseif(is_file(ABSPATH . 'wp-admin/upgrade-functions.php')){
    		require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
    	}
    
    	if($wpdb->get_var("SHOW TABLES LIKE '".$wpdb->prefix."page2cat'") != $wpdb->prefix."page2cat") {
    	dbDelta($query);
    	delete_option('pixline_page2cat_version');
    	add_option('pixline_page2cat_version', 6);
    	}
    
    update_option('p2c_use_empty','false');
    update_option('p2c_show_used_pages','false');
    update_option('p2c_catlist_limit',5);
    update_option('p2c_catlist_title','');
    update_option('p2c_excerpt_settings','');
    update_option('p2c_post_settings','');
    // new revisions
    update_option('p2c_excerpt_length', 500);
    update_option('p2c_use_thumbnail', 'false');
    update_option('p2c_img_class', 'alignleft');
    update_option('p2c_title_class', 'clearBoth');
    
    endif;
    
    delete_option('p2c_use_img');		// deprecated, so we're going to delete it anyway.
    if( !get_option('p2c_use_empty')) 		update_option('p2c_use_empty','false');
    if(!get_option('p2c_show_used_pages')) 	update_option('p2c_show_used_pages','false');
    if(!get_option('p2c_catlist_limit')) 	update_option('p2c_catlist_limit',5);
    if(!get_option('p2c_catlist_title')) 	update_option('p2c_catlist_title','');
    }
    if(!get_option('p2c_excerpt_settings')) update_option('p2c_excerpt_settings','');
    if(!get_option('p2c_post_settings')) update_option('p2c_post_settings','');
    // new revisions
    if(!get_option('p2c_excerpt_length')) update_option('p2c_excerpt_length',500);
    if(!get_option('p2c_use_thumbnail')) update_option('p2c_use_thumbnail','false');
    if(!get_option('p2c_img_class')) update_option('p2c_img_class','alignleft');
    if(!get_option('p2c_title_class')) update_option('p2c_title_class','clearBoth');
    
    ######################################
    # setup management and option panels #
    ######################################
    
    // adds a panel under "manage ? category pages"
    // shows actual connections, and allow creations of new ones.
    function page2cat_manage_page(){
    global $wpdb, $wp_db_version;
    
    	#print_r($_POST); #die();
    
    	// multiple delete
    	if( isset($_POST['deleteit']) && !empty($_POST['p2c_reldel'])):
    		foreach($_POST['p2c_reldel'] as $key=>$id):
    			$query = "DELETE FROM {$wpdb->page2cat} WHERE rel_ID = '".$id."' LIMIT 1;";
    			$daje = $wpdb->get_results($query);
    		endforeach;
    	echo '<div id="message" class="updated fade">
    			<p><strong>Some connections deleted.</strong></p></div>';
    	endif;
    
    	// multiple link
    	if( isset($_POST['action']) && $_POST['p2c_linkto'] == true && $_POST['multipageid'] != ""):
    #	print_r($_POST);
    		$pageid = $_POST['multipageid'][0];
    		foreach($_POST['p2c_reladd'] as $key=>$id):
    		if(trim($id)!=""):
    			$query = "INSERT INTO {$wpdb->page2cat} (rel_ID, page_ID, cat_ID) VALUES ('', '".$pageid."', '".$id."');";
    			$daje = $wpdb->get_results($query);
    		endif;
    		endforeach;
    		echo '<div id="message" class="updated fade">
    			<p><strong>Connections created.</strong></p></div>';
    
    	elseif( isset($_POST['action']) && $_POST['p2c_update'] == true):
    #	print_r($_POST); die();
    		$pageid = $_POST['pageid'];
    		foreach($pageid as $cat_id=>$page_id):
    			if(trim($page_id) != ""):
    			$sql = "INSERT INTO {$wpdb->page2cat} (rel_ID, page_ID, cat_ID) VALUES ('', '".$page_id."', '".$cat_id."');";
    			$result = $wpdb->get_results($sql);
    			endif;
    		endforeach;
    		echo('<div id="message" class="updated fade">
    		<p><strong>New Category Page created succesfully.</strong></p></div>');
    	endif;
    
    	// single delete, confirm request
    	if( isset($_REQUEST['p2cdel']) && !isset($_REQUEST['p2c_confirm']) ):
    		$relid = $wpdb->escape($_REQUEST['p2cdel']);
    		echo "<div class='wrap'><h2>Delete this Category &rsaquo; Page relation?</h2>";
    		$opt = $wpdb->get_results("SELECT * FROM {$wpdb->page2cat} WHERE rel_ID = '".$relid."' LIMIT 1;");
    		$catid = $opt[0]->cat_ID;
    		$pageid = $opt[0]->page_ID;
    		$catname = get_cat_name($catid);
    		$page = get_page($pageid);
    		$title = $page->post_title;
    		echo "<form name='p2c_confirm' method='post'>";
    		echo "<p>You are going to delete the relationship between
    		Category <em>".$catname."</em> and Page <em>".$title."</em>. Confirm?</p>";
    		echo '<p>
    		<input type="hidden" name="p2cdel" value="'.$relid.'" />
    		<input type="hidden" name="p2c_confirm" value="true" />
    		<input type="reset" name="revert" value="Cancel" />
    		<input type="submit" name="confirm" value="DELETE &raquo;" />
    		</p></form>';
    		echo "</div>";
    	endif;
    
    	// confirmed, so delete this connection
    	if( isset($_REQUEST['p2cdel']) && $_REQUEST['p2c_confirm'] == 'true'):
    	$relid = $wpdb->escape($_REQUEST['p2cdel']);
    	$myopts = $wpdb->get_results("DELETE FROM {$wpdb->page2cat} WHERE rel_ID = '".$relid."' LIMIT 1;");
    	echo('<div id="message" class="updated fade"><p><strong>You have succesfully deleted a connection.</strong></p></div>');
    	echo "<div class='wrap'><a href='edit.php?page=category-pages'>Back to Category Pages manage page</a></div>";
    	endif;
    
    	/*
    		real pages
    	*/
    	$count_used = $wpdb->get_var("SELECT count(*) FROM {$wpdb->page2cat};");
    
    	if($wp_db_version >= 6124):	// this is WordPress >= 2.3
    	$count_full = $wpdb->get_var("SELECT count(*)
    		FROM {$wpdb->terms} AS t LEFT JOIN {$wpdb->term_taxonomy} AS tt
    		ON t.term_id = tt.term_id WHERE tt.taxonomy='category';");
    
    	$count_noempty = $wpdb->get_var("SELECT count(*)
    		FROM {$wpdb->terms} AS t LEFT JOIN {$wpdb->term_taxonomy} AS tt
    		ON t.term_id = tt.term_id WHERE tt.taxonomy='category' AND tt.count != '0';");
    	else: // WP < 2.3
    	$count_full = $wpdb->get_var("SELECT count(*) FROM {$wpdb->categories};");
    	$count_noempty = $wpdb->get_var("SELECT count(*) FROM {$wpdb->categories}; WHERE category_count != '0';");
    	endif;
    
    	$count_free = $count_full - $count_used;
    	if(get_option('p2c_use_empty') == "false"): $count_usable = $count_noempty - $count_used; else : $count_usable = $count_free; endif;
    
    	// this is the already connected page
    
    	$myopts = $wpdb->get_results("SELECT * FROM {$wpdb->page2cat} ORDER BY page_ID ASC;");
    	$usedcats = array();
    	$usedpages = array();
    
    		if($_REQUEST['view'] == 'new'):
    			$css1 = ''; 	$css2 = ' class="current"';
    			$pagetitle = "<small>New connection</small>";
    		else:
    			$css1 = ' class="current"'; $css2 = '';
    			$pagetitle = "<small>Manage connections</small>";
    		endif;
    
    	if( !isset($_REQUEST['p2cdel'])):
    		echo "<div class='wrap'><h2>Category Pages</h2>";
    		echo '<ul class="subsubsub">
    		<li><a href="edit.php?page=category-pages"'.$css1.'>Manage connections ('.$count_used.')</a> |</li>
    		<li><a href="edit.php?page=category-pages&view=new"'.$css2.'>Free categories ('.$count_usable.'/'.$count_free.')</a></li>
    		</ul>';
    
    if($_REQUEST['view'] != 'new'):
    
    		if(count($myopts) != 0):
    #		echo "<div><p>These categories and these pages are already connected each other. You can view the category page in your website, clicking on the Category name. You can also edit or delete each connection.</p>";
    
    		echo "<div class='tablenav'>";
    		echo "<div class='tablenav-pages'>&nbsp;</div>";
    		echo '<div style="float: left">
    			<form id="p2c_del" name="p2c_del" method="post"/>
    			<input type="hidden" name="page" value="category-pages" />
    			<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    			<input type="hidden" name="action" value="p2c_del" />
    			<input type="submit" value="Delete Checked" name="deleteit" class="button-secondary delete" />
    			</div>';
    		echo "<br style='clear:both;' />";
    		echo "</div>";
    
    		echo "<br style='clear:both;' />";
    		echo '
    			';
    		echo "<table class='widefat'>";
    			echo "<thead>";
    			echo "<tr>
    				<th>";
    			if($wp_db_version >= 7098): echo "<input type='checkbox' onclick='checkAll(document.getElementById(\"p2c_del\"));' />" ;
    				else: echo "&nbsp;"; endif;
    			echo "</th>
    			<th>Host <strong>Category</strong></th>
    			<th>Header <strong>Page</strong></th>
    			<th>&nbsp;</th>
    			</tr>";
    			echo "</thead><tbody>";
    		foreach($myopts as $opt):
    			$catid = $opt->cat_ID;
    			$pageid = $opt->page_ID;
    			$catname = get_cat_name($catid);
    			$usedcats[] = $catid;
    			$usedpages[] = $pageid;
    			$page = get_page($pageid);
    			$title = $page->post_title;
    
    		echo "<tr>
    			<td><input type='checkbox' value='".$opt->rel_ID."' name='p2c_reldel[]' class='p2cbox' /></td>
    			<td><strong><a href='../?cat=".$catid."' title='View this Category Page in your website.'>".$catname."</a></strong>
    				<!-- (cat #".$catid.") --></td>
    			<td><strong><a href='page.php?action=edit&post=".$pageid."' title='Edit this page.'>".$title."
    				<!-- (page #".$pageid.") --></td>
    			<td><a href='?page=category-pages&p2cdel=".$opt->rel_ID."' class='delete' title='Delete this connection permanently.'>Delete</a></td>
    			</tr>";
    		endforeach;
    
    		echo "</tbody>";
    		echo "</table>";
    
    		echo "<div class='tablenav'>";
    		echo "<div class='tablenav-pages'>&nbsp;</div>";
    		echo '<div style="float: left">
    			<form name="p2c_del" method="post"/>
    			<input type="hidden" name="page" value="category-pages" />
    			<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    			<input type="hidden" name="action" value="p2c_del" />
    			<input type="submit" value="Delete Checked" name="deleteit" class="button-secondary delete" />
    			</form>
    			</div>';
    		echo "<br style='clear:both;' />";
    		echo "</div>";
    
    		else:
    
    		echo "<p>Sorry, no Category &raquo; Page connection available (yet). Maybe you want to <a href='edit.php?page=category-pages&view=new'>create some new connections</a>?</p>";
    		endif;
    
    else:
    // this is the 'new' page
    
    		$usedcats = $wpdb->get_col("SELECT cat_ID FROM {$wpdb->page2cat};");
    #		print_r($usedcats);
    		$opt3 = get_option('p2c_use_empty');
    		if($opt3 == "true"): $empty = false; $excats = ""; elseif($opt3 == "false"): $empty = true; $excats = implode(',',$usedcats); endif;
    
    		$catdef = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC',
    		'hide_empty' => $empty, 'include_last_update_time' => false, 'hierarchical' => true,
    		'exclude' => $excats, 'include' => '', 'number' => '', 'pad_counts' => true);
    		$others = get_categories($catdef);
    
    		$used = count($usedcats);
    		$count = count($others);
    
    		if( $count == 0):
    		echo "<p>Sorry, you don't have any usable category (or there are some, but empty; <a href='options-general.php?page=category-page-options'>check your settings</a>).</p>";
    		else:
    #		echo "<h3>New connections</h3>";
    #		echo "<div><p>These categories aren't connected with any page. Here you can setup a connection with an existent page, or create a brand new one.</p>";
    
    		echo "<form id='page2cat_manage' name='page2cat_manage' method='post'>";
    		$pages_already_used = implode(',',$usedpages);
    		if(get_option('p2c_show_used_pages')=='true') $exclude = $pages_already_used; else $exclude ="";
    
    		// wp_dropdown_pages settings (for both boxes in this page)
    		$pre_ddprefs = array('depth' => 0, 'child_of' => 0, 'selected' => 0,
    			'echo' => 0,'name' => 'multipageid[]', 'exclude' => $exclude,
    			'show_option_none' => '(none)');
    
    /*
    		echo "<div class='tablenav'>";
    		echo "<div class='tablenav-pages'>
    			<input type='submit' name='p2c_update' value='Update Category Pages' class='button'/>
    			<br style='clear:both;' />
    			</div>";
    		echo '<div style="float:left;">
    			<input type="hidden" name="page" value="category-pages" />
    			<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    			<input type="hidden" name="action" value="p2c_multilink" />
    			Link checked to:
    			'.wp_dropdown_pages($pre_ddprefs).'
    			<input type="submit" value="Link them!" name="p2c_linkto" class="button-secondary" />
    			</div>';
    		echo "<br style='clear:both;'/>&nbsp;<br style='clear:both;' />";
    		echo "</div>";
    */
    			echo "<table class='widefat'>";
    			echo "<thead>";
    			echo "<tr>
    			<th>";
    			if($wp_db_version >= 7098): echo "<input type='checkbox' onclick='checkAll(document.getElementById(\"page2cat_manage\"));' />";
    				else: echo "&nbsp;"; endif;
    			echo "</th>";
    			echo "<th>Host Category</th>
    			<th>Choose Page</th>
    			<th>Create New Page</th>
    			</tr>";
    			echo "</thead><tbody>";
    
    			foreach($others as $otro):
    			switch($wp_db_version):
    			// "7098"=>"2.5",	"6124"=>"2.3.3", "5183"=>"2.2.1", "4773"=>"2.1.3"
    				case ( $wp_db_version < 5183 ):	// WP 2.1.3 and smaller
    				$versioned_catid = $otro->cat_ID;
    				$versioned_catname = $otro->cat_name;
    				$versioned_slug = $otro->category_nicename;
    				$versioned_count = $otro->category_count + $otro->posts_private;
    				break;
    				case ( $wp_db_version >= 5183 ):	// WP 2.2.1 and greater
    				default:
    				$versioned_catid = $otro->term_id;
    				$versioned_catname = $otro->name;
    				$versioned_slug = $otro->category_nicename;
    				$versioned_count = $otro->count;
    				break;
    			endswitch;
    
    			// wp_dropdown_pages settings
    			$ddprefs = array('depth' => 0, 'child_of' => 0, 'selected' => 0,
    				'echo' => 0,'name' => 'pageid['.$versioned_catid.']',
    				'exclude' => $exclude, 'show_option_none' => '(none)');
    
    			$output = "<tr>
    			<td><input type='checkbox' value='".$versioned_catid."' name='p2c_reladd[]' /></td>
    			<td>".$versioned_catname." <!-- (".$versioned_count.") --></td>
    			<td>".wp_dropdown_pages($ddprefs)."</td>";
    			$output .= "<td><a href='page-new.php?p2c=".$versioned_catid."'>Create New</a></td>
    			</tr>";
    
    			$stringhe[$versioned_catname] = $output;
    			endforeach;
    
    			asort($stringhe);
    			reset($stringhe);
    
    			foreach($stringhe as $stringa):
    				echo $stringa;
    			endforeach;
    
    			echo "</tbody>";
    			echo "</table>";
    
    			echo "<div class='tablenav'>";
    			echo "<div style='float:right;'>
    				<input type='submit' name='p2c_update' value='Update Category Pages' class='button'/>
    				</div>";
    			echo '<div style="float:left;">
    				<input type="hidden" name="page" value="category-pages" />
    				<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    				<input type="hidden" name="action" value="p2c_multilink" />
    				Link checked to:
    				'.wp_dropdown_pages($pre_ddprefs).'
    				<input type="submit" value="Link them!" name="p2c_linkto" class="button-secondary" />
    				</div>';
    			echo "<br style='clear:both;'/>";
    			echo "</div>";
    endif;
    
    		echo "</form>";
    		endif;
    		echo PIXLINE_FOOTER;
    		echo "</div>";
    	endif;
    }
    
    // adds styles in admin head (WP 2.5+)
    function page2cat_metabox_styles(){
    ?>
    <style type="text/css" media="screen">
    #p2c-scroller{
    	width:100%;
    }
    
    ul#p2c-bind li, ul#p2c-free li{
    	list-style-type:none;
    	width:32%;
    	float:left;
    	font-size:80%;
    }
    
    .p2c-cleaner{
    	clear:both;
    	height:1px;
    }
    .p2c-used{
    	color:#D66;
    	text-decoration:line-through;
    }
    .p2c-catlink{
    	color:#000;
    	text-decoration:none;
    	border-bottom:1px dotted #CCC;
    }
    </style>
    <?php
    wp_enqueue_script('admin-forms');
    }
    
    // adds styles in admin head (WP < 2.5)
    function page2cat_sidebox_styles(){
    ?>
    <style type="text/css" media="screen">
    #p2c-scroller{
    	height:120px;
    	overflow:auto;
    	width:90%;
    	margin:0% 5%;
    }
    
    #p2c-box p{
    	margin:0px;
    	padding:5px;
    	font-size:80%;
    }
    
    ul#p2c-bind, ul#p2c-free,
    ul#p2c-bind li, ul#p2c-free li{
    	margin:0px;
    	padding:0px;
    	list-style-type:none;
    }
    
    ul#p2c-bind{
    	font-size:90%;
    	margin:1% 0%;
    }
    
    ul#p2c-free{
    	font-size:80%;
    	color:#333;
    	margin:2%;
    }
    
    ul#p2c-free li{
    	padding:2px 1px;
    }
    
    .p2c-count{
    	color:#AAA;
    }
    
    .p2c-indent{
    	padding-left:10px;
    }
    
    .p2c-used{
    	color:#D66;
    	text-decoration:line-through;
    }
    
    .p2c-catlink{
    	color:#000;
    	text-decoration:none;
    	border-bottom:1px dotted #CCC;
    }
    
    </style>
    <?php
    }
    
    // adds sidebox in page editing (until WP 2.3x)
    function page2cat_add_sidebox($post_ID){
    ?>
    <fieldset id="p2c-select" class="dbx-box">
    <h3 class="dbx-handle">Category Pages</h3>
    <div class="dbx-content" id="p2c-box">
    	<?php page2cat_add_meta_box($post_ID);	?>
    </div>
    </fieldset>
    <?php
    
    }
    
    function page2cat_add_meta_box($post_ID){
    	global $wpdb, $post_ID, $_REQUEST;
    #	if(isset($_REQUEST['p2c'])):
    #	endif;
    
    	$mypage = $wpdb->get_results("SELECT * FROM {$wpdb->page2cat} WHERE page_ID = '".$post_ID."';",OBJECT);
    	?>
    		<p>Use this page as <a href='edit.php?page=category-pages'>Category Page</a> for these categories.</p>
    	<?php
    	$usedcats = array();
    	if(count($mypage)>0):
    		echo "<ul id='p2c-bind'>";
    		foreach($mypage as $connection):
    	#		print_r($connection);
    			echo "<li><input type='checkbox' checked='checked' value='".$connection->cat_ID."' name='p2c_bind[]'
    			id='p2c".$connection->cat_ID."' /> ".get_cat_name($connection->cat_ID)."</li>
    			";
    			$usedcats[] = $connection->cat_ID;
    		endforeach;
    		echo "</ul>";
    	endif;
    
    		$opt3 = get_option('p2c_use_empty');
    		if($opt3 == "true"): $empty = false; $exclude = "";
    		elseif($opt3 == "false"): $empty = true; $exclude = implode(',',$usedcats);
    		endif;
    
    	$catdef = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC', 'exclude' => $exclude,
    					'hide_empty' => $empty, 'include_last_update_time' => false, 'hierarchical' => true, 'pad_counts' => true);
    
    	$others = get_categories($catdef);
    	echo "<div id='p2c-scroller'>";
    	echo "<ul id='p2c-free'>";
    	foreach($others as $cat):
    	#print_r($cat); exit();
    	if($cat->cat_ID == $_REQUEST['p2c']): $flag = "checked='checked'"; else: $flag = ""; endif;
    
    	$has_page = $wpdb->get_var("SELECT count(*) FROM {$wpdb->page2cat} WHERE cat_ID = '".$cat->cat_ID."'");
    	if($has_page == 0):
    	echo "<li><input type='checkbox' name='p2c_bind[]' id='p2c".$cat->cat_ID."' value='".$cat->cat_ID."' ".$flag."/> "
    	."<a class='p2c-catlink' href='../?cat=".$cat->cat_ID."' title='".get_cat_name($cat->cat_ID)." (".$cat->category_count." items inside).'>".get_cat_name($cat->cat_ID)."</a></li>
    	";
    	else:
    #	echo "<li><input type='checkbox' disabled='disabled' name='p2c_bind[]' id='p2c".$cat->cat_ID."' value='".$cat->cat_ID."'/> <span class='p2c-used'>"
    #	.get_cat_name($cat->cat_ID)." </span><span class='p2c-count'>(".$cat->category_count." items)</span></li>
    #	";
    	$nothing = 0;
    	endif;
    	endforeach;
    	echo "</ul>";
    	echo "<br style='clear:both;' />";
    	echo "</div>";
    	?>
    	<?php
    }
    
    // trigger page save/edit and make db relations
    function page2cat_trigger_save($post_ID){
    global $wpdb;
    
    $values = $_POST['p2c_bind'];
    $via = "DELETE FROM {$wpdb->page2cat} WHERE page_ID = '".$_POST['post_ID']."'";
    $result = $wpdb->get_results($via);
    if(count($values) > 0):
    foreach($values as $key=>$cat){
    	if($_POST['post_ID'] != ""):
    	$sql = "INSERT INTO {$wpdb->page2cat} (rel_ID, page_ID, cat_ID) VALUES ('','".$_POST['post_ID']."','".$cat."')";
    	$result = $wpdb->get_results($sql);
    	endif;
    }
    endif;
    }
    
    // trigger page deletion and free db relations
    function page2cat_trigger_delete(){
    	// yes, there's no trigger, actually....
    }
    
    // add the function for neat_trim
    function neat_trim($str, $n, $delim='...') {
    $str = str_replace("\n","",$str);
    //$str = str_replace("\r",",$str);
    $str = strip_tags($str);
      $len = strlen($str);
       if ($len > $n) {
           preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches);
           return rtrim($matches[1]) . $delim;
       }
       else {
           return $str;
       }
    }
    
    // filter the content of a page, check for tag and replace it with a list of posts in the requested category.
    // function heavily inspired from Alex Rabe NextGen Gallery's nggfunctions.php.
    function page2cat_content_catlist($content){
    global $post;
    $excerpt_settings=get_option('p2c_excerpt_settings');
    $post_settings=get_option('p2c_post_settings');
    $excerpt_length=get_option('p2c_excerpt_length');
    $thumbnail_option=get_option('p2c_use_thumbnail');
    $img_class=get_option('p2c_img_class');
    $title_class=get_option('p2c_title_class');
    
    // Show excerpts
    if($excerpt_settings == "on")
    {
    	if ( stristr( $content, '[catlist' )) {
    		$search = "@(?:<p>)*\s*\[catlist\s*=\s*(\w+|^\+)\]\s*(?:</p>)*@i";
    		if	(preg_match_all($search, $content, $matches)) {
    			if (is_array($matches)) {
    				$title = get_option('p2c_catlist_title');
    				if($title != "") $output = "<h4>".$title."</h4>"; else $output = "";
    				$limit = get_option('p2c_catlist_limit');
    				foreach ($matches[1] as $key =>$v0) {
    					$catposts = get_posts('category='.$v0."&numberposts=".$limit);
    						foreach($catposts as $single):
                                                    $single_post_content = $single->post_content;
    												if($excerpt_length == 0){
    													$excerpt_length = 500;
    												}
    												if($img_class == ""){
    													$img_class = 'alignleft';
    												}
    												if($title_class == ""){
    													$img_class = 'clearBoth';
    												}
    												$excerpt = neat_trim($single_post_content, $excerpt_length);
    												$excerpt .= "<a href='".get_permalink($single->ID)."'>more</a>";
    												if($thumbnail_option != false){
    													$the_thumb = get_the_post_thumbnail($single->ID, 'thumbnail', array('class' => $img_class));
    
    													$output .= "<h2 class='". $title_class ."'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>" . $the_thumb . $excerpt ."</p>";
    												}else{
    													$output .= "<h2 class='" . $title_class . "'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>". $excerpt ."</p>";
    												}
    						endforeach;
    					$search = $matches[0][$key];
    					$replace= $output;
    					$content= str_replace ($search, $replace, $content);
    				}
    			$output .= "";
    			}
    		}
    	}
    
    // Show full posts
    }elseif($post_settings == "on")
    {
    	if ( stristr( $content, '[catlist' )) {
    		$search = "@(?:<p>)*\s*\[catlist\s*=\s*(\w+|^\+)\]\s*(?:</p>)*@i";
    		if	(preg_match_all($search, $content, $matches)) {
    			if (is_array($matches)) {
    				$title = get_option('p2c_catlist_title');
    				if($title != "") $output = "<h4>".$title."</h4>"; else $output = "";
    				$limit = get_option('p2c_catlist_limit');
    				foreach ($matches[1] as $key =>$v0) {
    					$catposts = get_posts('category='.$v0."&numberposts=".$limit);
    						foreach($catposts as $single):
    												if($img_class == ""){
    													$img_class = 'alignleft';
    												}
    												if($title_class == ""){
    													$img_class = 'clearBoth';
    												}
    												if($thumbnail_option != false){
    													$the_thumb = get_the_post_thumbnail($single->ID, 'thumbnail', array('class' => $img_class));
    
    						$output .= "<h2 class='".$title_class."'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>" . $the_thumb . $single->post_content ."</p>";
    												}else{
    													$output .= "<h2 class='".$title_class."'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>" . $single->post_content ."</p>";
    												}
    
    						endforeach;
    					$search = $matches[0][$key];
    					$replace= $output;
    					$content= str_replace ($search, $replace, $content);
    				}
    			$output .= "";
    			}
    		}
    	}
    // show just a list
    }else
    {
    	if ( stristr( $content, '[catlist' )) {
    		$search = "@(?:<p>)*\s*\[catlist\s*=\s*(\w+|^\+)\]\s*(?:</p>)*@i";
    		if	(preg_match_all($search, $content, $matches)) {
    			if (is_array($matches)) {
    				$title = get_option('p2c_catlist_title');
    				if($title != "") $output = "<h4>".$title."</h4>"; else $output = "";
    				$output .= "<ul class='p2c_catlist'>";
    				$limit = get_option('p2c_catlist_limit');
    				foreach ($matches[1] as $key =>$v0) {
    					$catposts = get_posts('category='.$v0."&numberposts=".$limit);
    						foreach($catposts as $single):
    						$output .= "<li><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></li>";
    						endforeach;
    					$search = $matches[0][$key];
    					$replace= $output;
    					$content= str_replace ($search, $replace, $content);
    				}
    			$output .= "</ul>";
    			}
    		}
    	}
    
    }
    return $content;
    }
    
    // add real option page
    function page2cat_options_page(){
    global $wpdb, $styles;
    
    $p2c_defaults = array("show_usedpages_yes"=>"","show_usedpages_no"=>"","use_empty_no"=>"", "use_empty_yes"=>"", "catlist_limit"=>"", "catlist_title"=>"", "use_thumbnail_yes" => "", "use_thumbnail_no" => "");
    
    if(isset($_POST['page2cat_action'])):
    #print_r($_POST); #die();
    	$sane1 = strip_tags(htmlentities($_POST['p2c_catlist_limit']));
    	update_option('p2c_catlist_limit',$sane1);
    	$sane4 = strip_tags(htmlentities($_POST['p2c_catlist_title']));
    	update_option('p2c_catlist_title',$sane4);
    	$sane2 = strip_tags(htmlentities($_POST['p2c_show_used_pages']));
    	update_option('p2c_show_used_pages',$sane2);
    	$sane3 = strip_tags(htmlentities($_POST['p2c_use_empty']));
    	update_option('p2c_use_empty',$sane3);
    	$excerpt_settings = !isset($_POST['excerpt_settings'])? 'off': 'on';
    	update_option('p2c_excerpt_settings', $excerpt_settings);
    	$post_settings = !isset($_POST['post_settings'])? 'off': 'on';
    	update_option('p2c_post_settings', $post_settings)? 'off': 'on';
    	$excerpt_length = strip_tags(htmlentities($_POST['p2c_excerpt_length']));
    	update_option('p2c_excerpt_length',$excerpt_length);
    	$use_thumb = strip_tags(htmlentities($_POST['p2c_use_thumbnail']));
    	update_option('p2c_use_thumbnail', $use_thumb);
    	$img_class = strip_tags(htmlentities($_POST['p2c_img_class']));
    	update_option('p2c_img_class', $img_class);
    	$title_class = strip_tags(htmlentities($_POST['p2c_title_class']));
    	update_option('p2c_title_class', $title_class);
    	// Check if our excerpt settings are screwed up and reset if necessary
    	if($excerpt_settings == 'on' && $post_settings == 'on'){
    		echo('<div id="message" class="updated fade"><p><strong>ERROR! You cannot have both Excerpts and Posts set! Setting both to off!</strong></p></div');
    		update_option('p2c_excerpt_settings', 'off');
    		update_option('p2c_post_settings', 'off');
    	}else{
    
    	echo('<div id="message" class="updated fade"><p><strong>Settings saved.</strong></p></div>');
    }
    endif;
    
    $opt3 = get_option('p2c_use_empty');
    if($opt3 == "false"){
    	$p2c_defaults['use_empty_no'] = ' selected="selected"';
    }elseif($opt3 == "true"){
    	$p2c_defaults['use_empty_yes'] = ' selected="selected"';
    }
    
    $opt2 = get_option('p2c_show_used_pages');
    if($opt2 == "false"){
    	$p2c_defaults['show_usedpages_no'] = ' selected="selected"';
    }elseif($opt2 == "true"){
    	$p2c_defaults['show_usedpages_yes'] = ' selected="selected"';
    }
    
    $excerpt_settings = (get_option('p2c_excerpt_settings')=='on') ? 'checked':'';
    $post_settings = (get_option('p2c_post_settings')=='on') ? 'checked':'';
    
    // get the excerpt length
    $excerpt_length = get_option('p2c_excerpt_length');
    
    // get the thumbnail option
    $use_thumb = get_option('p2c_use_thumbnail');
    if($use_thumb == "false"){
    	$p2c_defaults['use_thumbnail_no'] = ' selected="selected"';
    }elseif($use_thumb == "true"){
    	$p2c_defaults['use_thumbnail_yes'] = ' selected="selected"';
    }
    
    $p2c_catlist_title = get_option('p2c_catlist_title');
    
    	echo "<div class='wrap'>";
    	echo "<h2>Category Page settings</h2>";
    	echo "<form method='post' name='page2cat_options' accept-charset='utf-8'>";
    
    	echo '
    	<h3>Management settings</h3>
    	<p>These settings let you customize your <a href="edit.php?page=category-pages">Category Page management panel</a>.</p>
    	<table class="form-table">
    	<tr valign="top">
    	<th scope="row">Show empty categories</th>
    	<td>
    	<select name="p2c_use_empty">
    	<option value="false"'.$p2c_defaults['use_empty_no'].' label=" No, thanks. "> No, thanks. </option>
    	<option value="true"'.$p2c_defaults['use_empty_yes'].' label=" Yes, please! "> Yes, please! </option>
    	</select> <small>(Choose whether empty categories are shown or not. )</small>
    	</td>
    	</tr>
    
    	<tr valign="top">
    	<th scope="row">Allow single page sharing</th>
    	<td>
    	<select name="p2c_show_used_pages">
    	<option value="false"'.$p2c_defaults['show_usedpages_no'].' label=" No, thanks. "> No, thanks. </option>
    	<option value="true"'.$p2c_defaults['show_usedpages_yes'].' label=" Yes, please! "> Yes, please! </option>
    	</select> <small>(You can share a single page with more than a category, if you like.)</small>
    	</td>
    	</tr>
    
    	</table>
    
    	<h3><code>[catlist]</code> tag settings</h3>
    	<p>You can use a <em>[catlist=xx]</em> tag in a post/page to show a list of post from a certain category, replacing <em>xx</em> with the category ID.</p>
    	<table class="form-table">
    	<tr valign="top">
    	<th scope="row">Display at most </th>
    	<td>
    	<select name="p2c_catlist_limit">';
    
    	$limits = array(1,2,3,4,5,6,7,8,9,10,15,20,25);
    	foreach($limits as $limit):
    		if(get_option('p2c_catlist_limit') == $limit) $flag = "selected='selected'"; else $flag = "";
    		echo "<option value='".$limit."' name='opt".$limit."' ".$flag.">".$limit."</option>";
    	endforeach;
    
    	echo '</select> posts.
    	</td>
    	</tr>
    
    	<tr valign="top">
    	<th scope="row">Display list title</th>
    	<td><input type="text" name="p2c_catlist_title" value="'.$p2c_catlist_title.'" size="30"/>
    	<small>(Leave empty to show a post list without a title.)</small>
    	</td>
    	</tr>
    	</table>
    
    	<h3>Excerpt or Full Post Settings</h3>
    	<p>You can choose to display full posts or excerpts only by checking one of the boxes. Do not check both as it will error out. Excerpts will be 500 characters for now until I add in another option for it.</p>
    	<table class="form-table">
    	<tr valign="top">
    	<td><input id="check5" type="checkbox" name="excerpt_settings"'.$excerpt_settings.' />
    	<label for="check5">Display only excerpts?</label></td>
    	</tr>
    	<tr valign="top">
    	<td><input id="check6" type="checkbox" name="post_settings"'.$post_settings.' />
    	<label for="check6">Display full posts?</label></td>
    	</tr>
    	<tr valign="top">
    	<td><input type="text" name="p2c_excerpt_length" value="'.$excerpt_length.'" size="30"/>
    	<small>Default is set to 500</small>
    	</td>
    	</tr>
    	<tr>
    	<td><select name="p2c_use_thumbnail">
    	<option value="false"'.$p2c_defaults['use_thumbnail_no'].' label=" No thumbnails. "> No thumbnails. </option>
    	<option value="true"'.$p2c_defaults['use_thumbnail_yes'].' label=" Yes thumbnails! "> Yes thumbnails! </option>
    	</select> <small>(If you select yes you\'ll need to enable post or page thumbnails in your theme.)</small>
    	</td>
    	</tr>
    	<tr>
    	<td><input type="text" name="p2c_img_class" value="'.$img_class.'" size="30"/>
    	<small>Default is set to alignleft</small>
    	</td>
    	</tr>
    	<td><input type="text" name="p2c_title_class" value="'.$title_class.'" size="30"/>
    	<small>Default is set to clearBoth - css to add to your theme for clearBoth: .clearBoth{clear:both}</small>
    	</td>
    	</tr>
    	</table>
    	';	
    
    	echo '<p class="submit">
    	<input type="hidden" name="page2cat_action" value="update" />
    	<input type="submit" name="update" value="Update Settings" />
    	</p>
    	</fieldset>';
    
    	echo '</form>';
    	echo PIXLINE_FOOTER;
    	echo "</div>";
    }
    
    // template function for manual hacks and widgets :-)
    function page2cat_output($cat, $style = 'getpost', $useimg = 1){
    global $wpdb;
    
    	$useimg = get_option('p2c_use_img');
    	$mypage = $wpdb->get_row("SELECT * FROM {$wpdb->page2cat} WHERE cat_ID = '".$cat."';",OBJECT);
    #	print_r($mypage);
    	$pageid = $mypage->page_ID;
    	if($pageid != ""):
    
    	switch($style):
    
    	case 'getpost':
    	?>
    	<div id="category-page-header">
    	<?php
    	$post = $post_temp;
    	$post = get_post($pageid);
    	setup_postdata($post);
    
    	if($post->post_title!=""){
    				?>
    				<div id="p2c-header">
    					<h2><?php echo $post->post_title; ?></h2>
    					<p><?php the_content(); ?></p>
    				</div>
    		<div class="category-page-cleaner"></div>
    	</div>
    	<?php
    	$post = $post_temp;
    	}
    	break;
    
    	case 'widget':
    	?>
    	<div id="category-widget-header">
    	<?php
    	$pagina = "SELECT * FROM {$wpdb->posts} WHERE ID='".$pageid."' AND post_type = 'page';";
    	$mine = $wpdb->get_results($pagina);
    	if($mine[0]->post_title!=""){
    				?>
    				<div id="p2c-header">
    					<!-- h2><?php echo $mine[0]->post_title; ?></h2 -->
    					<p><?php echo wptexturize($mine[0]->post_content,1); ?></p>
    				</div>
    		<div class="category-widget-cleaner"></div>
    	</div>
    	<?php
    	}
    
    	break;
    	case 'inline':
    	default:
    	?>
    	<div id="category-page-header">
    	<?php
    	$pagina = "SELECT * FROM {$wpdb->posts} WHERE ID='".$pageid."' AND post_type = 'page';";
    	$mine = $wpdb->get_results($pagina);
    	if($mine[0]->post_title!=""){
    				?>
    				<div id="p2c-header">
    					<h2><?php echo $mine[0]->post_title; ?></h2>
    					<p><?php echo wptexturize($mine[0]->post_content,1); ?></p>
    				</div>
    		<div class="category-page-cleaner"></div>
    	</div>
    	<?php
    	}
    	break;
    
    	endswitch;
    
    	?>
    	<?php
    	else:
    	echo '<h2 class="pagetitle">Archive for the ‘'.single_cat_title('',false).'’ Category</h2>';
    	endif;
    }
    
    // adds sidebox in page write/edit
    function page2cat_init(){
    	if (function_exists('add_meta_box')) {
    		add_meta_box('page2cat','Category Page Options', 'page2cat_add_meta_box', 'page');
    		add_action('admin_head','page2cat_metabox_styles');
    	} else {
    		add_action('dbx_page_sidebar', 'page2cat_add_sidebox');
    		add_action('admin_head','page2cat_sidebox_styles');
    	}
    }
    // install management and options page
    function page2cat_config_page() {
    	if ( function_exists('add_submenu_page') && is_admin()):
    	add_submenu_page('edit.php', __('Category Pages'), __('Category Pages'), 8, 'category-pages', 'page2cat_manage_page');
    	endif;
    	if( function_exists('add_options_page') && is_admin()):
    	add_options_page('Category Pages options','Category Pages',8,'category-page-options','page2cat_options_page');
    	endif;
    }
    
    if( is_admin() ):
    	if( preg_match('|page-new.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|page.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|edit.php|i', $_SERVER['REQUEST_URI']) ){
    			add_action('admin_menu', 'page2cat_init');
    	}
    	add_action('admin_menu', 'page2cat_config_page');
    	add_action('save_post','page2cat_trigger_save');
    endif;
    
    add_filter('the_content','page2cat_content_catlist');	// by popular demand :-)
    ?>

    As a note: I did not release this as a new plugin because I did not want to support it. I appreciate the feedback and questions, but I’m broke, unemployed, have a wife, 2 kids and a dog and I do this to help support the community. I’m not looking for pity, just letting everyone know that while I’m open to helping out and adding things, I am not going to be the best point of contact, nor am I going to be able to fix every little thing. It works with wordpress 3.0.5 and it shouldn’t break. The only thing that still sucks about it is the full post setting strips the html out and I don’t know why.

    You’ll need two (minimum) css classes for this to work properly with excerpts and posts: alignleft <- standard in most themes and clearBoth <- just what I use to clear things.

    .alignleft{
    float: left;
    }
    .clearBoth{
    clear: both;
    }

    You can add whatever you want, but those two are necessary unless you set other options for the classes.

    Hopefully this helps someone out. Again, I can’t fix everything, but if you need help just ask and I’ll do my best. I will not be your code fixer, though. If you’re new to wp and php, sorry I can’t help. I just don’t have time.

Viewing 15 replies - 1 through 15 (of 19 total)
  • Thread Starter Pneumonic

    (@pneumonic)

    Update:

    * added an option to control the thumbnail size
    * when using full posts, the content now shows up with proper html formatting
    * fixed bug with thumbnail showing up in posts and excerpts no matter what was selected if there was a featured image

    Still need to add pagination, but I think it’s going to take more time consuming than I’m probably willing to invest. Sooooo, if someone has an idea of how it can be achieved, let me know and I’d be happy to work on it with you. Here’s the newest version:

    <?php
    /*
    Plugin Name: Category Page
    Plugin URI: https://pixline.net/wordpress-plugins/category-page-wordpress-plugin/en/
    Description: Use pages as category archive header, or list some posts from a category into a post/page. Heavily modified by John P. Neumann at https://AnimateShmanimate.com
    Author: Pixline, John P. Neumann
    Version: 2.6.3
    Author URI: https://pixline.net/
    
    Copyright (C) 2008 Paolo Tresso / Pixline (https://pixline.net/)
    Revisions (C) 2011 The Entire World - But John P. Neumann made the changes (https://animateshmanimate.com)
    
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    
    -----------------------------------------
    Revisions for excerpts, full posts and thumbnails done by John P. Neumann ([email protected])
    
    - As a note: I appreciate the feedback and questions, but please remember that I'm broke, unemployed, have a wife, 2 kids and a dog and I do this to help support the community.
    
    /*
    	TODO Add pagination
    
    */
    /* 
    
    CHANGELOG
    
    2.6.3
    
    * added an option to control the thumbnail size
    * when using full posts, the content now shows up with proper html formatting
    * fixed bug with thumbnail showing up in posts and excerpts no matter what was selected if there was a featured image
    
    2.6.2
    
    * removed things that were unnecessary or broken
    * added pagination
    * added option to control image size
    * added option to not strip html tags
    
    2.6.1
    
    * added option to control excerpt length
    * added an option to include post-thumbnails
    * added an option to choose a class for the header h2 that's output
    * added an option to choose a class for the images for the posts thumbnails
    * changed version number to 2.6.1
    
    2.6
    
    * added 2 rows to the database named p2c_post_settings and p2c_excerpt_settings
    * added options to admin page for posts and excerpts
    * added code for both posts and settings to be available (although not at the same time)
    * added additional code for settings to be available
    * added the functionality
    * added code to disable both excerpts and posts if they are both checked since that would be stupid
    
    */
    if(preg_match('#' . basename(__FILE__) . '#', $_SERVER['PHP_SELF'])) { die('You are not allowed to call this page directly.'); }
    
    /*
    	TODO If I'm going to manage this, then I need to update all this crap, but I don't really want to manage it.
    */
    define("PAGE2CAT_VERSION","2.6.3");
    define("PLUGIN_PATH",get_bloginfo('url')."/wp-content/plugins/page2cat/");
    
    define('PIXLINE_FOOTER','<p><hr style="margin-top:50px;height:1px;background:#CCC;border:0px;clear:both;" />
    <strong>
    <a href="https://pixline.net/wordpress-plugins/category-page-wordpress-plugin/en/">Category Page</a></strong> plugin
     | <strong><a href="https://animateshmanimate.com">John P. Neumann</a></strong>
    <strike><small> |
    <a href="https://talks.pixline.net/forum.php?id=3">Support Forum</a></strike> |
    GPL2&copy; &ge; 2007 <a href="https://pixline.net/about/en/">Paolo Tresso / Pixline</a> |
    <strike>If you like this plugin, support its development with a <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=paolo%40pixline%2enet&item_name=Support%20to%20opensource%20projects%20at%20Pixline&no_shipping=1&cn=Something%20to%20say%3f&tax=0&currency_code=EUR&lc=IT&bn=PP%2dDonationsBF&charset=UTF%2d8">small donation</a>.</strike>
    |<small>The support forums are nill and as such you shouldn\'t donate to something that isn\'t giving back and is broken.</small>
    </p>');
    /*
    END REMOVE
    */
    $wpdb->page2cat	= $table_prefix . 'page2cat';
    
    ######################################################
    # check version. #
    ######################################################
    
    $p2c_version = get_option('pixline_page2cat_version');
    	register_activation_hook(__FILE__, 'page2cat_install');
    
    // DB installation. usually happen just one time.
    function page2cat_install(){
    global $wpdb, $p2c_version;
    
    if ($version < 6):
    	$query = "
    	CREATE TABLE  <code>&quot;.$wpdb->prefix.&quot;page2cat</code> (
    	 <code>rel_ID</code> BIGINT NOT NULL AUTO_INCREMENT ,
    	 <code>page_ID</code> BIGINT NOT NULL ,
    	 <code>cat_ID</code> BIGINT NOT NULL ,
    	PRIMARY KEY (  <code>rel_ID</code> ) ,
    	INDEX (  <code>page_ID</code> ,  <code>cat_ID</code> )
    	);
    	";
    
    	if(is_file(ABSPATH . 'wp-admin/includes/upgrade.php')){
    		require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    	}elseif(is_file(ABSPATH . 'wp-admin/upgrade-functions.php')){
    		require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
    	}
    	/* TODO what the fuck is this - a forced update for the version number?*/
    	if($wpdb->get_var("SHOW TABLES LIKE '".$wpdb->prefix."page2cat'") != $wpdb->prefix."page2cat") {
    	dbDelta($query);
    	delete_option('pixline_page2cat_version');
    	add_option('pixline_page2cat_version', 6);
    	}
    
    update_option('p2c_use_empty','false');
    update_option('p2c_show_used_pages','false');
    update_option('p2c_catlist_limit',5);
    update_option('p2c_catlist_title','');
    update_option('p2c_excerpt_settings','');
    update_option('p2c_post_settings','');
    // new revisions
    update_option('p2c_excerpt_length', 500);
    update_option('p2c_use_thumbnail', 'false');
    update_option('p2c_img_class', 'alignleft');
    update_option('p2c_title_class', 'clearBoth');
    update_option('p2c_thumbnail_size', 'thumbnail');
    
    endif;
    
    delete_option('p2c_use_img');		// deprecated, so we're going to delete it anyway.
    if( !get_option('p2c_use_empty')) 		update_option('p2c_use_empty','false');
    if(!get_option('p2c_show_used_pages')) 	update_option('p2c_show_used_pages','false');
    if(!get_option('p2c_catlist_limit')) 	update_option('p2c_catlist_limit',5);
    if(!get_option('p2c_catlist_title')) 	update_option('p2c_catlist_title','');
    }
    if(!get_option('p2c_excerpt_settings')) update_option('p2c_excerpt_settings','');
    if(!get_option('p2c_post_settings')) update_option('p2c_post_settings','');
    // new revisions
    if(!get_option('p2c_excerpt_length')) update_option('p2c_excerpt_length',500);
    if(!get_option('p2c_use_thumbnail')) update_option('p2c_use_thumbnail','false');
    if(!get_option('p2c_img_class')) update_option('p2c_img_class','alignleft');
    if(!get_option('p2c_title_class')) update_option('p2c_title_class','clearBoth');
    if(!get_option('p2c_thumbnail_size')) update_option('p2c_thumbnail_size','thumbnail');
    
    ######################################
    # setup management and option panels #
    ######################################
    /*
    	TODO most of this shit is pointless especially the connections shit.
    */
    // adds a panel under "manage ? category pages"
    // shows actual connections, and allow creations of new ones.
    function page2cat_manage_page(){
    global $wpdb, $wp_db_version;
    
    	#print_r($_POST); #die();
    
    	// multiple delete
    	if( isset($_POST['deleteit']) && !empty($_POST['p2c_reldel'])):
    		foreach($_POST['p2c_reldel'] as $key=>$id):
    			$query = "DELETE FROM {$wpdb->page2cat} WHERE rel_ID = '".$id."' LIMIT 1;";
    			$daje = $wpdb->get_results($query);
    		endforeach;
    	echo '<div id="message" class="updated fade">
    			<p><strong>Some connections deleted.</strong></p></div>';
    	endif;
    
    	// multiple link
    	if( isset($_POST['action']) && $_POST['p2c_linkto'] == true && $_POST['multipageid'] != ""):
    #	print_r($_POST);
    		$pageid = $_POST['multipageid'][0];
    		foreach($_POST['p2c_reladd'] as $key=>$id):
    		if(trim($id)!=""):
    			$query = "INSERT INTO {$wpdb->page2cat} (rel_ID, page_ID, cat_ID) VALUES ('', '".$pageid."', '".$id."');";
    			$daje = $wpdb->get_results($query);
    		endif;
    		endforeach;
    		echo '<div id="message" class="updated fade">
    			<p><strong>Connections created.</strong></p></div>';
    
    	elseif( isset($_POST['action']) && $_POST['p2c_update'] == true):
    #	print_r($_POST); die();
    		$pageid = $_POST['pageid'];
    		foreach($pageid as $cat_id=>$page_id):
    			if(trim($page_id) != ""):
    			$sql = "INSERT INTO {$wpdb->page2cat} (rel_ID, page_ID, cat_ID) VALUES ('', '".$page_id."', '".$cat_id."');";
    			$result = $wpdb->get_results($sql);
    			endif;
    		endforeach;
    		echo('<div id="message" class="updated fade">
    		<p><strong>New Category Page created succesfully.</strong></p></div>');
    	endif;
    
    	// single delete, confirm request
    	if( isset($_REQUEST['p2cdel']) && !isset($_REQUEST['p2c_confirm']) ):
    		$relid = $wpdb->escape($_REQUEST['p2cdel']);
    		echo "<div class='wrap'><h2>Delete this Category &rsaquo; Page relation?</h2>";
    		$opt = $wpdb->get_results("SELECT * FROM {$wpdb->page2cat} WHERE rel_ID = '".$relid."' LIMIT 1;");
    		$catid = $opt[0]->cat_ID;
    		$pageid = $opt[0]->page_ID;
    		$catname = get_cat_name($catid);
    		$page = get_page($pageid);
    		$title = $page->post_title;
    		echo "<form name='p2c_confirm' method='post'>";
    		echo "<p>You are going to delete the relationship between
    		Category <em>".$catname."</em> and Page <em>".$title."</em>. Confirm?</p>";
    		echo '<p>
    		<input type="hidden" name="p2cdel" value="'.$relid.'" />
    		<input type="hidden" name="p2c_confirm" value="true" />
    		<input type="reset" name="revert" value="Cancel" />
    		<input type="submit" name="confirm" value="DELETE &raquo;" />
    		</p></form>';
    		echo "</div>";
    	endif;
    
    	// confirmed, so delete this connection
    	if( isset($_REQUEST['p2cdel']) && $_REQUEST['p2c_confirm'] == 'true'):
    	$relid = $wpdb->escape($_REQUEST['p2cdel']);
    	$myopts = $wpdb->get_results("DELETE FROM {$wpdb->page2cat} WHERE rel_ID = '".$relid."' LIMIT 1;");
    	echo('<div id="message" class="updated fade"><p><strong>You have succesfully deleted a connection.</strong></p></div>');
    	echo "<div class='wrap'><a href='edit.php?page=category-pages'>Back to Category Pages manage page</a></div>";
    	endif;
    
    	/*
    		real pages
    	*/
    	$count_used = $wpdb->get_var("SELECT count(*) FROM {$wpdb->page2cat};");
    
    	if($wp_db_version >= 6124):	// this is WordPress >= 2.3
    	$count_full = $wpdb->get_var("SELECT count(*)
    		FROM {$wpdb->terms} AS t LEFT JOIN {$wpdb->term_taxonomy} AS tt
    		ON t.term_id = tt.term_id WHERE tt.taxonomy='category';");
    
    	$count_noempty = $wpdb->get_var("SELECT count(*)
    		FROM {$wpdb->terms} AS t LEFT JOIN {$wpdb->term_taxonomy} AS tt
    		ON t.term_id = tt.term_id WHERE tt.taxonomy='category' AND tt.count != '0';");
    	else: // WP < 2.3
    	$count_full = $wpdb->get_var("SELECT count(*) FROM {$wpdb->categories};");
    	$count_noempty = $wpdb->get_var("SELECT count(*) FROM {$wpdb->categories}; WHERE category_count != '0';");
    	endif;
    
    	$count_free = $count_full - $count_used;
    	if(get_option('p2c_use_empty') == "false"): $count_usable = $count_noempty - $count_used; else : $count_usable = $count_free; endif;
    
    	// this is the already connected page
    
    	$myopts = $wpdb->get_results("SELECT * FROM {$wpdb->page2cat} ORDER BY page_ID ASC;");
    	$usedcats = array();
    	$usedpages = array();
    
    		if($_REQUEST['view'] == 'new'):
    			$css1 = ''; 	$css2 = ' class="current"';
    			$pagetitle = "<small>New connection</small>";
    		else:
    			$css1 = ' class="current"'; $css2 = '';
    			$pagetitle = "<small>Manage connections</small>";
    		endif;
    
    	if( !isset($_REQUEST['p2cdel'])):
    		echo "<div class='wrap'><h2>Category Pages</h2>";
    		echo '<ul class="subsubsub">
    		<li><a href="edit.php?page=category-pages"'.$css1.'>Manage connections ('.$count_used.')</a> |</li>
    		<li><a href="edit.php?page=category-pages&view=new"'.$css2.'>Free categories ('.$count_usable.'/'.$count_free.')</a></li>
    		</ul>';
    
    if($_REQUEST['view'] != 'new'):
    
    		if(count($myopts) != 0):
    #		echo "<div><p>These categories and these pages are already connected each other. You can view the category page in your website, clicking on the Category name. You can also edit or delete each connection.</p>";
    
    		echo "<div class='tablenav'>";
    		echo "<div class='tablenav-pages'>&nbsp;</div>";
    		echo '<div style="float: left">
    			<form id="p2c_del" name="p2c_del" method="post"/>
    			<input type="hidden" name="page" value="category-pages" />
    			<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    			<input type="hidden" name="action" value="p2c_del" />
    			<input type="submit" value="Delete Checked" name="deleteit" class="button-secondary delete" />
    			</div>';
    		echo "<br style='clear:both;' />";
    		echo "</div>";
    
    		echo "<br style='clear:both;' />";
    		echo '
    			';
    		echo "<table class='widefat'>";
    			echo "<thead>";
    			echo "<tr>
    				<th>";
    			if($wp_db_version >= 7098): echo "<input type='checkbox' onclick='checkAll(document.getElementById(\"p2c_del\"));' />" ;
    				else: echo "&nbsp;"; endif;
    			echo "</th>
    			<th>Host <strong>Category</strong></th>
    			<th>Header <strong>Page</strong></th>
    			<th>&nbsp;</th>
    			</tr>";
    			echo "</thead><tbody>";
    		foreach($myopts as $opt):
    			$catid = $opt->cat_ID;
    			$pageid = $opt->page_ID;
    			$catname = get_cat_name($catid);
    			$usedcats[] = $catid;
    			$usedpages[] = $pageid;
    			$page = get_page($pageid);
    			$title = $page->post_title;
    
    		echo "<tr>
    			<td><input type='checkbox' value='".$opt->rel_ID."' name='p2c_reldel[]' class='p2cbox' /></td>
    			<td><strong><a href='../?cat=".$catid."' title='View this Category Page in your website.'>".$catname."</a></strong>
    				<!-- (cat #".$catid.") --></td>
    			<td><strong><a href='page.php?action=edit&post=".$pageid."' title='Edit this page.'>".$title."
    				<!-- (page #".$pageid.") --></td>
    			<td><a href='?page=category-pages&p2cdel=".$opt->rel_ID."' class='delete' title='Delete this connection permanently.'>Delete</a></td>
    			</tr>";
    		endforeach;
    
    		echo "</tbody>";
    		echo "</table>";
    
    		echo "<div class='tablenav'>";
    		echo "<div class='tablenav-pages'>&nbsp;</div>";
    		echo '<div style="float: left">
    			<form name="p2c_del" method="post"/>
    			<input type="hidden" name="page" value="category-pages" />
    			<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    			<input type="hidden" name="action" value="p2c_del" />
    			<input type="submit" value="Delete Checked" name="deleteit" class="button-secondary delete" />
    			</form>
    			</div>';
    		echo "<br style='clear:both;' />";
    		echo "</div>";
    
    		else:
    
    		echo "<p>Sorry, no Category &raquo; Page connection available (yet). Maybe you want to <a href='edit.php?page=category-pages&view=new'>create some new connections</a>?</p>";
    		endif;
    
    else:
    // this is the 'new' page
    
    		$usedcats = $wpdb->get_col("SELECT cat_ID FROM {$wpdb->page2cat};");
    #		print_r($usedcats);
    		$opt3 = get_option('p2c_use_empty');
    		if($opt3 == "true"): $empty = false; $excats = ""; elseif($opt3 == "false"): $empty = true; $excats = implode(',',$usedcats); endif;
    
    		$catdef = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC',
    		'hide_empty' => $empty, 'include_last_update_time' => false, 'hierarchical' => true,
    		'exclude' => $excats, 'include' => '', 'number' => '', 'pad_counts' => true);
    		$others = get_categories($catdef);
    
    		$used = count($usedcats);
    		$count = count($others);
    
    		if( $count == 0):
    		echo "<p>Sorry, you don't have any usable category (or there are some, but empty; <a href='options-general.php?page=category-page-options'>check your settings</a>).</p>";
    		else:
    #		echo "<h3>New connections</h3>";
    #		echo "<div><p>These categories aren't connected with any page. Here you can setup a connection with an existent page, or create a brand new one.</p>";
    
    		echo "<form id='page2cat_manage' name='page2cat_manage' method='post'>";
    		$pages_already_used = implode(',',$usedpages);
    		if(get_option('p2c_show_used_pages')=='true') $exclude = $pages_already_used; else $exclude ="";
    
    		// wp_dropdown_pages settings (for both boxes in this page)
    		$pre_ddprefs = array('depth' => 0, 'child_of' => 0, 'selected' => 0,
    			'echo' => 0,'name' => 'multipageid[]', 'exclude' => $exclude,
    			'show_option_none' => '(none)');
    
    /*
    		echo "<div class='tablenav'>";
    		echo "<div class='tablenav-pages'>
    			<input type='submit' name='p2c_update' value='Update Category Pages' class='button'/>
    			<br style='clear:both;' />
    			</div>";
    		echo '<div style="float:left;">
    			<input type="hidden" name="page" value="category-pages" />
    			<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    			<input type="hidden" name="action" value="p2c_multilink" />
    			Link checked to:
    			'.wp_dropdown_pages($pre_ddprefs).'
    			<input type="submit" value="Link them!" name="p2c_linkto" class="button-secondary" />
    			</div>';
    		echo "<br style='clear:both;'/>&nbsp;<br style='clear:both;' />";
    		echo "</div>";
    */
    			echo "<table class='widefat'>";
    			echo "<thead>";
    			echo "<tr>
    			<th>";
    			if($wp_db_version >= 7098): echo "<input type='checkbox' onclick='checkAll(document.getElementById(\"page2cat_manage\"));' />";
    				else: echo "&nbsp;"; endif;
    			echo "</th>";
    			echo "<th>Host Category</th>
    			<th>Choose Page</th>
    			<th>Create New Page</th>
    			</tr>";
    			echo "</thead><tbody>";
    
    			foreach($others as $otro):
    			switch($wp_db_version):
    			// "7098"=>"2.5",	"6124"=>"2.3.3", "5183"=>"2.2.1", "4773"=>"2.1.3"
    				case ( $wp_db_version < 5183 ):	// WP 2.1.3 and smaller
    				$versioned_catid = $otro->cat_ID;
    				$versioned_catname = $otro->cat_name;
    				$versioned_slug = $otro->category_nicename;
    				$versioned_count = $otro->category_count + $otro->posts_private;
    				break;
    				case ( $wp_db_version >= 5183 ):	// WP 2.2.1 and greater
    				default:
    				$versioned_catid = $otro->term_id;
    				$versioned_catname = $otro->name;
    				$versioned_slug = $otro->category_nicename;
    				$versioned_count = $otro->count;
    				break;
    			endswitch;
    
    			// wp_dropdown_pages settings
    			$ddprefs = array('depth' => 0, 'child_of' => 0, 'selected' => 0,
    				'echo' => 0,'name' => 'pageid['.$versioned_catid.']',
    				'exclude' => $exclude, 'show_option_none' => '(none)');
    
    			$output = "<tr>
    			<td><input type='checkbox' value='".$versioned_catid."' name='p2c_reladd[]' /></td>
    			<td>".$versioned_catname." <!-- (".$versioned_count.") --></td>
    			<td>".wp_dropdown_pages($ddprefs)."</td>";
    			$output .= "<td><a href='page-new.php?p2c=".$versioned_catid."'>Create New</a></td>
    			</tr>";
    
    			$stringhe[$versioned_catname] = $output;
    			endforeach;
    
    			asort($stringhe);
    			reset($stringhe);
    
    			foreach($stringhe as $stringa):
    				echo $stringa;
    			endforeach;
    
    			echo "</tbody>";
    			echo "</table>";
    
    			echo "<div class='tablenav'>";
    			echo "<div style='float:right;'>
    				<input type='submit' name='p2c_update' value='Update Category Pages' class='button'/>
    				</div>";
    			echo '<div style="float:left;">
    				<input type="hidden" name="page" value="category-pages" />
    				<input type="hidden" name="view" value="'.$_REQUEST['view'].'" />
    				<input type="hidden" name="action" value="p2c_multilink" />
    				Link checked to:
    				'.wp_dropdown_pages($pre_ddprefs).'
    				<input type="submit" value="Link them!" name="p2c_linkto" class="button-secondary" />
    				</div>';
    			echo "<br style='clear:both;'/>";
    			echo "</div>";
    endif;
    
    		echo "</form>";
    		endif;
    		echo PIXLINE_FOOTER;
    		echo "</div>";
    	endif;
    }
    
    // adds styles in admin head (WP 2.5+)
    function page2cat_metabox_styles(){
    ?>
    <style type="text/css" media="screen">
    #p2c-scroller{
    	width:100%;
    }
    
    ul#p2c-bind li, ul#p2c-free li{
    	list-style-type:none;
    	width:32%;
    	float:left;
    	font-size:80%;
    }
    
    .p2c-cleaner{
    	clear:both;
    	height:1px;
    }
    .p2c-used{
    	color:#D66;
    	text-decoration:line-through;
    }
    .p2c-catlink{
    	color:#000;
    	text-decoration:none;
    	border-bottom:1px dotted #CCC;
    }
    </style>
    <?php
    wp_enqueue_script('admin-forms');
    }
    
    // adds styles in admin head (WP < 2.5)
    function page2cat_sidebox_styles(){
    ?>
    <style type="text/css" media="screen">
    #p2c-scroller{
    	height:120px;
    	overflow:auto;
    	width:90%;
    	margin:0% 5%;
    }
    
    #p2c-box p{
    	margin:0px;
    	padding:5px;
    	font-size:80%;
    }
    
    ul#p2c-bind, ul#p2c-free,
    ul#p2c-bind li, ul#p2c-free li{
    	margin:0px;
    	padding:0px;
    	list-style-type:none;
    }
    
    ul#p2c-bind{
    	font-size:90%;
    	margin:1% 0%;
    }
    
    ul#p2c-free{
    	font-size:80%;
    	color:#333;
    	margin:2%;
    }
    
    ul#p2c-free li{
    	padding:2px 1px;
    }
    
    .p2c-count{
    	color:#AAA;
    }
    
    .p2c-indent{
    	padding-left:10px;
    }
    
    .p2c-used{
    	color:#D66;
    	text-decoration:line-through;
    }
    
    .p2c-catlink{
    	color:#000;
    	text-decoration:none;
    	border-bottom:1px dotted #CCC;
    }
    
    </style>
    <?php
    }
    /*
    	TODO what the fuck is this for? or the meta box? useless shit.
    */
    // adds sidebox in page editing (until WP 2.3x)
    function page2cat_add_sidebox($post_ID){
    ?>
    <fieldset id="p2c-select" class="dbx-box">
    <h3 class="dbx-handle">Category Pages</h3>
    <div class="dbx-content" id="p2c-box">
    	<?php page2cat_add_meta_box($post_ID);	?>
    </div>
    </fieldset>
    <?php
    
    }
    
    function page2cat_add_meta_box($post_ID){
    	global $wpdb, $post_ID, $_REQUEST;
    #	if(isset($_REQUEST['p2c'])):
    #	endif;
    
    	$mypage = $wpdb->get_results("SELECT * FROM {$wpdb->page2cat} WHERE page_ID = '".$post_ID."';",OBJECT);
    	?>
    		<p>Use this page as <a href='edit.php?page=category-pages'>Category Page</a> for these categories.</p>
    	<?php
    	$usedcats = array();
    	if(count($mypage)>0):
    		echo "<ul id='p2c-bind'>";
    		foreach($mypage as $connection):
    	#		print_r($connection);
    			echo "<li><input type='checkbox' checked='checked' value='".$connection->cat_ID."' name='p2c_bind[]'
    			id='p2c".$connection->cat_ID."' /> ".get_cat_name($connection->cat_ID)."</li>
    			";
    			$usedcats[] = $connection->cat_ID;
    		endforeach;
    		echo "</ul>";
    	endif;
    
    		$opt3 = get_option('p2c_use_empty');
    		if($opt3 == "true"): $empty = false; $exclude = "";
    		elseif($opt3 == "false"): $empty = true; $exclude = implode(',',$usedcats);
    		endif;
    
    	$catdef = array('type' => 'post', 'child_of' => 0, 'orderby' => 'name', 'order' => 'ASC', 'exclude' => $exclude,
    					'hide_empty' => $empty, 'include_last_update_time' => false, 'hierarchical' => true, 'pad_counts' => true);
    
    	$others = get_categories($catdef);
    	echo "<div id='p2c-scroller'>";
    	echo "<ul id='p2c-free'>";
    	foreach($others as $cat):
    	#print_r($cat); exit();
    	if($cat->cat_ID == $_REQUEST['p2c']): $flag = "checked='checked'"; else: $flag = ""; endif;
    
    	$has_page = $wpdb->get_var("SELECT count(*) FROM {$wpdb->page2cat} WHERE cat_ID = '".$cat->cat_ID."'");
    	if($has_page == 0):
    	echo "<li><input type='checkbox' name='p2c_bind[]' id='p2c".$cat->cat_ID."' value='".$cat->cat_ID."' ".$flag."/> "
    	."<a class='p2c-catlink' href='../?cat=".$cat->cat_ID."' title='".get_cat_name($cat->cat_ID)." (".$cat->category_count." items inside).'>".get_cat_name($cat->cat_ID)."</a></li>
    	";
    	else:
    #	echo "<li><input type='checkbox' disabled='disabled' name='p2c_bind[]' id='p2c".$cat->cat_ID."' value='".$cat->cat_ID."'/> <span class='p2c-used'>"
    #	.get_cat_name($cat->cat_ID)." </span><span class='p2c-count'>(".$cat->category_count." items)</span></li>
    #	";
    	$nothing = 0;
    	endif;
    	endforeach;
    	echo "</ul>";
    	echo "<br style='clear:both;' />";
    	echo "</div>";
    	?>
    	<?php
    }
    
    // trigger page save/edit and make db relations
    function page2cat_trigger_save($post_ID){
    global $wpdb;
    
    $values = $_POST['p2c_bind'];
    $via = "DELETE FROM {$wpdb->page2cat} WHERE page_ID = '".$_POST['post_ID']."'";
    $result = $wpdb->get_results($via);
    if(count($values) > 0):
    foreach($values as $key=>$cat){
    	if($_POST['post_ID'] != ""):
    	$sql = "INSERT INTO {$wpdb->page2cat} (rel_ID, page_ID, cat_ID) VALUES ('','".$_POST['post_ID']."','".$cat."')";
    	$result = $wpdb->get_results($sql);
    	endif;
    }
    endif;
    }
    
    // trigger page deletion and free db relations
    function page2cat_trigger_delete(){
    	// yes, there's no trigger, actually....
    }
    
    // add the function for neat_trim
    function neat_trim($str, $n, $delim='...') {
    $str = str_replace("\n","",$str);
    $str = strip_tags($str);
      $len = strlen($str);
       if ($len > $n) {
           preg_match('/(.{' . $n . '}.*?)\b/', $str, $matches);
           return rtrim($matches[1]) . $delim;
       }
       else {
           return $str;
       }
    }
    
    /*
    	TODO this whole area needs to be reworked and cleaned up, use what's relevant and what isn't, also need to add pagination for both posts and excerpts
    
    */
    
    // filter the content of a page, check for tag and replace it with a list of posts in the requested category.
    // function heavily inspired from Alex Rabe NextGen Gallery's nggfunctions.php.
    function page2cat_content_catlist($content){
    global $post;
    $excerpt_settings=get_option('p2c_excerpt_settings');
    $post_settings=get_option('p2c_post_settings');
    $excerpt_length=get_option('p2c_excerpt_length');
    $thumbnail_option=get_option('p2c_use_thumbnail');
    $img_class=get_option('p2c_img_class');
    $title_class=get_option('p2c_title_class');
    $thumb_size=get_option('p2c_thumbnail_size');
    
    // Show excerpts
    if($excerpt_settings == "on")
    {
    	if ( stristr( $content, '[catlist' )) {
    		$search = "@(?:<p>)*\s*\[catlist\s*=\s*(\w+|^\+)\]\s*(?:</p>)*@i";
    		if	(preg_match_all($search, $content, $matches)) {
    			if (is_array($matches)) {
    				$title = get_option('p2c_catlist_title');
    				if($title != "") $output = "<h4>".$title."</h4>"; else $output = "";
    				$limit = get_option('p2c_catlist_limit');
    				foreach ($matches[1] as $key =>$v0) {
    					$catposts = get_posts('category='.$v0."&numberposts=".$limit);
    						foreach($catposts as $single):
                                                    $single_post_content = $single->post_content;
    												if($excerpt_length == 0){
    													$excerpt_length = 500;
    												}
    												if($img_class == ""){
    													$img_class = 'alignleft';
    												}
    												if($title_class == ""){
    													$img_class = 'clearBoth';
    												}
    												$excerpt = neat_trim($single_post_content, $excerpt_length);
    												$excerpt .= "<a href='".get_permalink($single->ID)."'>more</a>";
    												if($thumbnail_option != 'false'){
    													// change thumbnail to an actual variable
    													$the_thumb = get_the_post_thumbnail($single->ID, $thumb_size, array('class' => $img_class));
    
    													$output .= "<h2 class='". $title_class ."'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>" . $the_thumb . $excerpt ."</p>";
    												}else{
    													$output .= "<h2 class='" . $title_class . "'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>". $excerpt ."</p>";
    												}
    						endforeach;
    					$search = $matches[0][$key];
    					$replace= $output;
    					$content= str_replace ($search, $replace, $content);
    				}
    			$output .= "";
    			}
    		}
    	}
    
    // Show full posts
    }elseif($post_settings == "on")
    {
    	if ( stristr( $content, '[catlist' )) {
    		$search = "@(?:<p>)*\s*\[catlist\s*=\s*(\w+|^\+)\]\s*(?:</p>)*@i";
    		if	(preg_match_all($search, $content, $matches)) {
    			if (is_array($matches)) {
    				$title = get_option('p2c_catlist_title');
    				if($title != "") $output = "<h4>".$title."</h4>"; else $output = "";
    				$limit = get_option('p2c_catlist_limit');
    				foreach ($matches[1] as $key =>$v0) {
    					$catposts = get_posts('category='.$v0."&numberposts=".$limit);
    						foreach($catposts as $single):
    												if($img_class == ""){
    													$img_class = 'alignleft';
    												}
    												if($title_class == ""){
    													$img_class = 'clearBoth';
    												}
    												if($thumbnail_option != 'false'){
    													$the_thumb = get_the_post_thumbnail($single->ID, $thumb_size, array('class' => $img_class));
    
    						$output .= "<h2 class='".$title_class."'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>" . $the_thumb . wpautop($single->post_content) ."</p>";
    												}else{
    													$output .= "<h2 class='".$title_class."'><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></h2><p>" . wpautop($single->post_content) ."</p>";
    												}
    
    						endforeach;
    					$search = $matches[0][$key];
    					$replace= $output;
    					$content= str_replace ($search, $replace, $content);
    				}
    			$output .= "";
    			}
    		}
    	}
    // show just a list
    }else
    {
    	if ( stristr( $content, '[catlist' )) {
    		$search = "@(?:<p>)*\s*\[catlist\s*=\s*(\w+|^\+)\]\s*(?:</p>)*@i";
    		if	(preg_match_all($search, $content, $matches)) {
    			if (is_array($matches)) {
    				$title = get_option('p2c_catlist_title');
    				if($title != "") $output = "<h4>".$title."</h4>"; else $output = "";
    				$output .= "<ul class='p2c_catlist'>";
    				$limit = get_option('p2c_catlist_limit');
    				foreach ($matches[1] as $key =>$v0) {
    					$catposts = get_posts('category='.$v0."&numberposts=".$limit);
    						foreach($catposts as $single):
    						$output .= "<li><a href='".get_permalink($single->ID)."'>".$single->post_title."</a></li>";
    						endforeach;
    					$search = $matches[0][$key];
    					$replace= $output;
    					$content= str_replace ($search, $replace, $content);
    				}
    			$output .= "</ul>";
    			}
    		}
    	}
    
    }
    return $content;
    }
    
    // add real option page
    function page2cat_options_page(){
    global $wpdb, $styles;
    
    /*
    	TODO we need to add the rest of the options to the p2c_defaults here
    */
    
    $p2c_defaults = array("show_usedpages_yes"=>"","show_usedpages_no"=>"","use_empty_no"=>"", "use_empty_yes"=>"", "catlist_limit"=>"", "catlist_title"=>"", "use_thumbnail_yes" => "", "use_thumbnail_no" => "", "thumbnail_size_thumb" => "", "thumbnail_size_med" => "", "thumbnail_size_lrg" => "");
    
    if(isset($_POST['page2cat_action'])):
    #print_r($_POST); #die();
    	$sane1 = strip_tags(htmlentities($_POST['p2c_catlist_limit']));
    	update_option('p2c_catlist_limit',$sane1);
    	$sane4 = strip_tags(htmlentities($_POST['p2c_catlist_title']));
    	update_option('p2c_catlist_title',$sane4);
    	$sane2 = strip_tags(htmlentities($_POST['p2c_show_used_pages']));
    	update_option('p2c_show_used_pages',$sane2);
    	$sane3 = strip_tags(htmlentities($_POST['p2c_use_empty']));
    	update_option('p2c_use_empty',$sane3);
    	$excerpt_settings = !isset($_POST['excerpt_settings'])? 'off': 'on';
    	update_option('p2c_excerpt_settings', $excerpt_settings);
    	$post_settings = !isset($_POST['post_settings'])? 'off': 'on';
    	update_option('p2c_post_settings', $post_settings)? 'off': 'on';
    	$excerpt_length = strip_tags(htmlentities($_POST['p2c_excerpt_length']));
    	update_option('p2c_excerpt_length',$excerpt_length);
    	$use_thumb = strip_tags(htmlentities($_POST['p2c_use_thumbnail']));
    	update_option('p2c_use_thumbnail', $use_thumb);
    	$img_class = strip_tags(htmlentities($_POST['p2c_img_class']));
    	update_option('p2c_img_class', $img_class);
    	$title_class = strip_tags(htmlentities($_POST['p2c_title_class']));
    	update_option('p2c_title_class', $title_class);
    	$thumbnail_size = strip_tags(htmlentities($_POST['p2c_thumbnail_size']));
    	update_option('p2c_thumbnail_size', $thumbnail_size);
    
    	// Check if our excerpt settings are screwed up and reset if necessary
    	if($excerpt_settings == 'on' && $post_settings == 'on'){
    		echo('<div id="message" class="updated fade"><p><strong>ERROR! You cannot have both Excerpts and Posts set! Setting both to off!</strong></p></div');
    		update_option('p2c_excerpt_settings', 'off');
    		update_option('p2c_post_settings', 'off');
    	}else{
    
    	echo('<div id="message" class="updated fade"><p><strong>Settings saved.</strong></p></div>');
    }
    endif;
    
    $opt3 = get_option('p2c_use_empty');
    if($opt3 == "false"){
    	$p2c_defaults['use_empty_no'] = ' selected="selected"';
    }elseif($opt3 == "true"){
    	$p2c_defaults['use_empty_yes'] = ' selected="selected"';
    }
    
    $opt2 = get_option('p2c_show_used_pages');
    if($opt2 == "false"){
    	$p2c_defaults['show_usedpages_no'] = ' selected="selected"';
    }elseif($opt2 == "true"){
    	$p2c_defaults['show_usedpages_yes'] = ' selected="selected"';
    }
    
    $excerpt_settings = (get_option('p2c_excerpt_settings')=='on') ? 'checked':'';
    $post_settings = (get_option('p2c_post_settings')=='on') ? 'checked':'';
    
    // get the excerpt length
    $excerpt_length = get_option('p2c_excerpt_length');
    
    // get the thumbnail option
    $use_thumb = get_option('p2c_use_thumbnail');
    if($use_thumb == "false"){
    	$p2c_defaults['use_thumbnail_no'] = ' selected="selected"';
    }elseif($use_thumb == "true"){
    	$p2c_defaults['use_thumbnail_yes'] = ' selected="selected"';
    }
    
    // get the thumbnail size option
    $thumbnail_size = get_option('p2c_thumbnail_size');
    if($thumbnail_size == "thumbnail"){
    	$p2c_defaults['thumbnail_size_thumb'] = ' selected="selected"';
    }elseif($thumbnail_size == "medium"){
    	$p2c_defaults['thumbnail_size_med'] = ' selected="selected"';
    }elseif($thumbnail_size == "large"){
    	$p2c_defaults['thumbnail_size_lrg'] = ' selected="selected"';
    }
    
    /*
    	TODO We need to fix this shit and make it standards compliant. Fucking tables
    */
    $p2c_catlist_title = get_option('p2c_catlist_title');
    
    	echo "<div class='wrap'>";
    	echo "<h2>Category Page settings</h2>";
    	echo "<form method='post' name='page2cat_options' accept-charset='utf-8'>";
    
    	echo '
    	<h3>Management settings</h3>
    	<p>These settings let you customize your <a href="edit.php?page=category-pages">Category Page management panel</a>.</p>
    	<table class="form-table">
    	<tr valign="top">
    	<th scope="row">Show empty categories</th>
    	<td>
    	<select name="p2c_use_empty">
    	<option value="false"'.$p2c_defaults['use_empty_no'].' label=" No, thanks. "> No, thanks. </option>
    	<option value="true"'.$p2c_defaults['use_empty_yes'].' label=" Yes, please! "> Yes, please! </option>
    	</select> <small>(Choose whether empty categories are shown or not. )</small>
    	</td>
    	</tr>
    
    	<tr valign="top">
    	<th scope="row">Allow single page sharing</th>
    	<td>
    	<select name="p2c_show_used_pages">
    	<option value="false"'.$p2c_defaults['show_usedpages_no'].' label=" No, thanks. "> No, thanks. </option>
    	<option value="true"'.$p2c_defaults['show_usedpages_yes'].' label=" Yes, please! "> Yes, please! </option>
    	</select> <small>(You can share a single page with more than a category, if you like.)</small>
    	</td>
    	</tr>
    
    	</table>
    
    	<h3><code>[catlist]</code> tag settings</h3>
    	<p>You can use a <em>[catlist=xx]</em> tag in a post/page to show a list of post from a certain category, replacing <em>xx</em> with the category ID.</p>
    	<table class="form-table">
    	<tr valign="top">
    	<th scope="row">Display at most </th>
    	<td>
    	<select name="p2c_catlist_limit">';
    
    	$limits = array(1,2,3,4,5,6,7,8,9,10,15,20,25);
    	foreach($limits as $limit):
    		if(get_option('p2c_catlist_limit') == $limit) $flag = "selected='selected'"; else $flag = "";
    		echo "<option value='".$limit."' name='opt".$limit."' ".$flag.">".$limit."</option>";
    	endforeach;
    
    	echo '</select> posts.
    	</td>
    	</tr>
    
    	<tr valign="top">
    	<th scope="row">Display list title</th>
    	<td><input type="text" name="p2c_catlist_title" value="'.$p2c_catlist_title.'" size="30"/>
    	<small>(Leave empty to show a post list without a title.)</small>
    	</td>
    	</tr>
    	</table>
    
    	<h3>Excerpt or Full Post Settings</h3>
    	<p>You can choose to display full posts or excerpts only by checking one of the boxes. Do not check both as it will error out. Excerpts will be 500 characters for now until I add in another option for it.</p>
    	<table class="form-table">
    	<tr valign="top">
    	<td><input id="check5" type="checkbox" name="excerpt_settings"'.$excerpt_settings.' />
    	<label for="check5">Display only excerpts?</label></td>
    	</tr>
    	<tr valign="top">
    	<td><input id="check6" type="checkbox" name="post_settings"'.$post_settings.' />
    	<label for="check6">Display full posts?</label></td>
    	</tr>
    	<tr valign="top">
    	<td><input type="text" name="p2c_excerpt_length" value="'.$excerpt_length.'" size="30"/>
    	<small>Default is set to 500</small>
    	</td>
    	</tr>
    	<tr>
    	<td><select name="p2c_use_thumbnail">
    	<option value="false"'.$p2c_defaults['use_thumbnail_no'].' label=" No thumbnails. "> No thumbnails. </option>
    	<option value="true"'.$p2c_defaults['use_thumbnail_yes'].' label=" Yes thumbnails! "> Yes thumbnails! </option>
    	</select> <small>(If you select yes you\'ll need to enable post or page thumbnails in your theme.)</small>
    	</td>
    	</tr>
    	<tr>
    	<td><select name="p2c_thumbnail_size">
    	<option value="thumbnail"'.$p2c_defaults['thumbnail_size_thumb'].' label=" Thumbnail "> Thumbnail </option>
    	<option value="medium"'.$p2c_defaults['thumbnail_size_med'].' label=" Medium "> Medium </option>
    	<option value="large"'.$p2c_defaults['thumbnail_size_lrg'].' label=" Large "> Large </option>
    	</select> <small>(You can set the sizes for these within settings->media settings.)</small>
    	</td>
    	</tr>
    	<tr>
    	<td><input type="text" name="p2c_img_class" value="'.$img_class.'" size="30"/>
    	<small>Default is set to alignleft</small>
    	</td>
    	</tr>
    	<td><input type="text" name="p2c_title_class" value="'.$title_class.'" size="30"/>
    	<small>Default is set to clearBoth - css to add to your theme for clearBoth: .clearBoth{clear:both}</small>
    	</td>
    	</tr>
    	</table>
    	';	
    
    	echo '<p class="submit">
    	<input type="hidden" name="page2cat_action" value="update" />
    	<input type="submit" name="update" value="Update Settings" />
    	</p>
    	</fieldset>';
    
    	echo '</form>';
    	echo PIXLINE_FOOTER;
    	echo "</div>";
    }
    
    /*
    	TODO what is this used for and where is it being used? Nowhere. Get rid of it.
    */
    // template function for manual hacks and widgets :-)
    function page2cat_output($cat, $style = 'getpost', $useimg = 1){
    global $wpdb;
    
    	$useimg = get_option('p2c_use_img');
    	$mypage = $wpdb->get_row("SELECT * FROM {$wpdb->page2cat} WHERE cat_ID = '".$cat."';",OBJECT);
    #	print_r($mypage);
    	$pageid = $mypage->page_ID;
    	if($pageid != ""):
    
    	switch($style):
    
    	case 'getpost':
    	?>
    	<div id="category-page-header">
    	<?php
    	$post = $post_temp;
    	$post = get_post($pageid);
    	setup_postdata($post);
    
    	if($post->post_title!=""){
    				?>
    				<div id="p2c-header">
    					<h2><?php echo $post->post_title; ?></h2>
    					<p><?php the_content(); ?></p>
    				</div>
    		<div class="category-page-cleaner"></div>
    	</div>
    	<?php
    	$post = $post_temp;
    	}
    	break;
    
    	case 'widget':
    	?>
    	<div id="category-widget-header">
    	<?php
    	$pagina = "SELECT * FROM {$wpdb->posts} WHERE ID='".$pageid."' AND post_type = 'page';";
    	$mine = $wpdb->get_results($pagina);
    	if($mine[0]->post_title!=""){
    				?>
    				<div id="p2c-header">
    					<!-- h2><?php echo $mine[0]->post_title; ?></h2 -->
    					<p><?php echo wptexturize($mine[0]->post_content,1); ?></p>
    				</div>
    		<div class="category-widget-cleaner"></div>
    	</div>
    	<?php
    	}
    
    	break;
    	case 'inline':
    	default:
    	?>
    	<div id="category-page-header">
    	<?php
    	$pagina = "SELECT * FROM {$wpdb->posts} WHERE ID='".$pageid."' AND post_type = 'page';";
    	$mine = $wpdb->get_results($pagina);
    	if($mine[0]->post_title!=""){
    				?>
    				<div id="p2c-header">
    					<h2><?php echo $mine[0]->post_title; ?></h2>
    					<p><?php echo wptexturize($mine[0]->post_content,1); ?></p>
    				</div>
    		<div class="category-page-cleaner"></div>
    	</div>
    	<?php
    	}
    	break;
    
    	endswitch;
    
    	?>
    	<?php
    	else:
    	echo '<h2 class="pagetitle">Archive for the ‘'.single_cat_title('',false).'’ Category</h2>';
    	endif;
    }
    
    /*
    	FIXME remove this page2cat_init since it's for a metabox, for what the fuck ever reason
    */
    
    // adds sidebox in page write/edit
    function page2cat_init(){
    	if (function_exists('add_meta_box')) {
    		add_meta_box('page2cat','Category Page Options', 'page2cat_add_meta_box', 'page');
    		add_action('admin_head','page2cat_metabox_styles');
    	} else {
    		add_action('dbx_page_sidebar', 'page2cat_add_sidebox');
    		add_action('admin_head','page2cat_sidebox_styles');
    	}
    }
    // install management and options page
    function page2cat_config_page() {
    	if ( function_exists('add_submenu_page') && is_admin()):
    	add_submenu_page('edit.php', __('Category Pages'), __('Category Pages'), 8, 'category-pages', 'page2cat_manage_page');
    	endif;
    	if( function_exists('add_options_page') && is_admin()):
    	add_options_page('Category Pages options','Category Pages',8,'category-page-options','page2cat_options_page');
    	endif;
    }
    
    /*
    	TODO not sure what these are here for - I believe it's for the stupid management menu that doesn't work
    */
    if( is_admin() ):
    	if( preg_match('|page-new.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|page.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|edit.php|i', $_SERVER['REQUEST_URI']) ){
    			add_action('admin_menu', 'page2cat_init');
    	}
    	add_action('admin_menu', 'page2cat_config_page');
    	add_action('save_post','page2cat_trigger_save');
    endif;
    
    add_filter('the_content','page2cat_content_catlist');	// by popular demand :-)
    ?>
    Plugin Author Paolo T. (pixline)

    (@pixline)

    WHOA! That’s awesome! I’m going to test it and update page2cat soon!
    I’m the original author of Category Page, and after a too long break I’m trying to update all my plugins, but I really didn’t expected this! Really thank you for caring so much!

    Can you please contact me at [email protected]? I’d like to have a talk with you!

    Respect
    Paolo aka pixline

    Thread Starter Pneumonic

    (@pneumonic)

    Glad you like the updates. I actually tried contacting you through your website at one point, but couldn’t get an email or anything to pop-up. I’ve sent you an email as well. ??

    Plugin Author Paolo T. (pixline)

    (@pixline)

    Code is now in trunk ready for testing and tweaks. I hope to release a full update next week.

    Pneumonic now have full rights on this plugin, so if I disappear again (which I hope not) someone will be able to manage it and decide for it. This is what open source was made for.

    Does anyone have a version of Page2cat compatible with WP 3.1 ?

    I installed it today. It works but when I create a new category or page, the category pages connections are reinitialized…

    It seems to be exactly the plugin I actually need…

    Thread Starter Pneumonic

    (@pneumonic)

    The current version posted here does somewhat work with 3.1. What doesn’t work is the linking to pages right now. You have to input it manually. We are currently looking into rewriting it entirely to utilize some of the new functionality provided by the newer versions of wp so keep watching for an update. Both of us have full-time gigs as well an we do this to support the community so please be patient with us. ?? Glad you’re interested in the plugin and the next version is going to be awesome.

    Ok. I spent some time to try this module. It works quite good with WP 3.1. Thank you, all !

    to get the plugin working a little bit well under WP 3.1, you (users) have to change lines near the las TODO (lines between 1124).

    Replace the if statement next to ‘if( is_admin() ):’ with :

    if( preg_match('|post-new.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|post.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|page.php|i', $_SERVER['REQUEST_URI']) ||
    		preg_match('|edit.php|i', $_SERVER['REQUEST_URI']) ){
    			add_action('admin_menu', 'page2cat_init');
    	}

    Plugin Author Paolo T. (pixline)

    (@pixline)

    Thank you! I’ll add it and test asap.

    I′m also very interested in using this on some new sites am I developing so very much looking forward to a fully compatible version – best of luck with it. I dont mind donating something for a working version either as it will really help me out.

    Great plugin and I really appreciate pixline and Pneumonic putting efforts into this. Thank you.

    I can’t seem the find a working link to the original pixline thread about tweaking archive.php file.

    Thanks so much!

    still can’t make any connections in wp3.1.2 even if using the above updates.. ?? which versions are verified to work with the plugin?

    Wow this is greaT! thank you very much, I have a couple of questions

    when I output the excerpt list of 5 there are no line breaks between each excerpt – it would be great to achieve this but don’t?know how.

    and how would one go about if he wanted to output post from categories 5 to 10 in another page instead of 1 to 5

    thanks again for this unique update

    by line breaks I am referring to post dividers between excrpt post

    Thread Starter Pneumonic

    (@pneumonic)

    @mohib – Not sure which archive.php you’re looking for.

    @markushamburger – It’s a known issue. Currently that panel doesn’t work, but we’re working on a fix for it.

    @tsiwt – Can you provide an example page so I can see what you’re talking about?

Viewing 15 replies - 1 through 15 (of 19 total)
  • The topic ‘[Plugin: Category Page] New update for Page2Cat’ is closed to new replies.