I need a page template that dynamically displays a grid of parent category thumbnail images linking to a grid of child category thumbnail images. I would like to be able to use custom post types as well. The plugin Category Images II can be used to upload images into the category.
A previous question was left unanswered. See link below.
http://wpquestions.com/question/show/id/2251
Thanks
Manoj Raj answers:
1) Install and Activate "Category Images II" plugin from the following url
http://wordpress.org/extend/plugins/category-images-ii/
2) Find "term-images.php" located in <em>category-images-ii -> view -> category-image"s-ii</em>
Replace the file with the one attached with this answer.
I have used the Twenty Eleven theme for testing purposes... You should modify the styles and html to fit your needs...
3) Create a new page template to display only the main categories (Top level categories)
<?php
/**
* Template Name: Main Categories Listing
* Description: A Page Template that Lists all the main categories
*/
get_header(); ?>
<div id="primary">
<div id="content" role="main">
<?php
$main_categories= get_terms('category', 'parent=0&hide_empty=0');
echo '<ul class="list-models">';
foreach($main_categories as $categorymain) {
echo '<li><a href="'.get_term_link($categorymain).'">';
ciii_term_images('category','term_ids='. $categorymain->term_id. '');
echo '<span>'.$categorymain->name.'</span></a></li>';
}
echo '</ul>';
?>
</div><!-- #content -->
</div><!-- #primary -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
If it is a custom taxonomy, create a new page template and then in
<em>get_terms</em> -> you can change the <strong>'category'</strong> parameter to the custom taxonomy you need to have.
In the same way, <em><em>ciii_term_images</em></em> -> you can change the 'category' to the custom taxonomy you need to have.
3) You need to modify the category page template(category.php in my case) to display the sub-categories (if it is a parent) and posts(if it has no child category)
<?php
/**
* The template for displaying Category Archive pages.
*
* @package WordPress
* @subpackage Twenty_Eleven
* @since Twenty Eleven 1.0
*/
global $wpdb, $wp_query;
$models = $wp_query->get_queried_object();
$models_children_check = $wpdb->get_results(" SELECT * FROM wp_term_taxonomy WHERE parent = $models->term_id ");
get_header(); ?>
<section id="primary">
<div id="content" role="main">
<?php
if($models_children_check) {
$sub_categories = get_terms($models->taxonomy, 'parent='. $models->term_id .'&hide_empty=0');
echo '<ul class="list-models">';
foreach ( $sub_categories as $sublist ) {
echo '<li><a href="'.get_term_link($sublist).'">';
ciii_term_images('category', 'term_ids='. $sublist->term_id. '');
echo '</a></li>';
}
echo '</ul>';
}
else {
$args = array(
'post_type' => 'post',
'tax_query' => array(
array(
'taxonomy' => $models->taxonomy,
'field' => 'id',
'terms' => $models->term_id
)
),
'orderby' => 'post_date'
);
$posts = new WP_Query($args);
if($posts->have_posts()) :
while($posts->have_posts()) : $posts->the_post();
echo '<div>';
the_content();
echo '</div>';
endwhile;
wp_reset_postdata();
else :
echo "No Posts Found";
endif;
}
?>
</div><!-- #content -->
</section><!-- #primary -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
If it is a custom taxonomy and custom post type, create a php file 'taxonomy-taxonomyname.php' and paste the above code and do the following modifications
in <em>ciii_term_images</em> -> change <strong>'category'</strong> to the custom taxonomy you need to have.
in posts <em>args</em> -> change <strong>'post_type'</strong> to the custom post type you need to have.
</em>
Manoj Raj comments:
The php file has not been attached.. .So replace the existing content in term-images.php with the following code
<?php if (!defined ('ABSPATH')) die ('No direct access allowed'); ?>
<?php foreach( $terms AS & $term ) { ?>
<img src="<?php echo $term[ 'image' ]; ?>" alt="<?php echo $term[ 'name' ]; ?>" />
<?php } ?>
If you have any doubts, do let me know...
tonepro1 comments:
My theme doesnt have a category.php file. Would it be the archive.php that I need to change? Or should I create a category.php file?
Manoj Raj comments:
Create a category.php file if your theme doesn't have one...
Arnav Joy answers:
so there are more then one image to each category or subcategory?
tonepro1 comments:
No. There is only one image to a category/subcategory. Multiple images would be visible if there were multiple subcategories.
Example
Top level category = Cars- 1 image
Sub category of cars = Audi + Volkswagen = 2 images
Subcategory of Audi= A4 + A5 + A3 = 3 images
Arnav Joy comments:
can you show me a actual sketch how these will be organize in this page
http://www.1hourwebsitepros.com/darkkastle/part-category/all-parts/
tonepro1 comments:
The link I provided is an example of how the category pages should function. The page is merely a table with a grid of images linking to another page. I'm sure you can see how time consuming this would be to manage
tonepro1 comments:
I did include a sketch. See the attachment.
Martin Pham answers:
you can use custom term meta to insert image link each category.
And select parent category when you post page (template category grid).
i can make it for you, it simple !!
tonepro1 comments:
Sounds like what Im looking for.
Martin Pham comments:
please try
This is for make custom category term meta and in-page custom field. Insert this into functions.php
function _get_custom_field( $field ) {
global $id, $post;
if ( null === $id && null === $post )
return false;
$post_id = null === $id ? $post->ID : $id;
$custom_field = get_post_meta( $post_id, $field, true );
if ( $custom_field )
return stripslashes( wp_kses_decode_entities( $custom_field ) );
return false;
}
add_action( 'admin_menu', '_add_inpage_category_box' );
function _add_inpage_category_box() {
foreach ( (array) get_post_types( array( 'public' => true ) ) as $type ) {
if($type == 'page')
add_meta_box( '_inpage_category_box', __( 'Select Category', 'marx' ), '_inpage_category_box', $type, 'normal', 'high' );
}
}
function _inpage_category_box() {
$categories = get_categories();
$current = _get_custom_field('_category_parent');
?>
<input type="hidden" name="_inpage_category_box_nonce" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
<p><label for="mx_category_parent"><?php _e( 'Select parent category', 'marx' ); ?></label></p>
<select name="marx[_category_parent]" id="mx_category_parent">
<option value="default" <?php selected( $current, 'default' ); ?> >Default</option>
<?php
foreach ($categories as $cat) {
echo '<option '. selected( $current, $cat->cat_ID ) .' value="'.$cat->cat_ID.'">'.$cat->cat_name.'</option>';
}
echo '</select>';
}
add_action( 'save_post', '_inpage_category_save', 1, 2 );
function _inpage_category_save($post_id, $post) {
if ( ! isset( $_POST['_inpage_category_box_nonce'] ) || ! wp_verify_nonce( $_POST['_inpage_category_box_nonce'], plugin_basename( __FILE__ ) ) )
return $post->ID;
/** Don't try to save the data under autosave, ajax, or future post */
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
if ( defined( 'DOING_CRON' ) && DOING_CRON )
return;
/** Don't try to store data during revision save */
if ( 'revision' == $post->post_type )
return;
$mx_category_parent = $_POST['marx'];
foreach ( (array) $mx_category_parent as $key => $value ) {
/** Save, or delete if the value is empty */
if ( $value != 'default')
update_post_meta( $post->ID, $key, $value );
else
delete_post_meta( $post->ID, $key );
}
}
/**
* Category term meta
*/
add_action( 'admin_init', '_add_taxonomy_image_options' );
function _add_taxonomy_image_options() {
foreach ( get_taxonomies( array( 'show_ui' => true ) ) as $tax_name ) {
if($tax_name == 'category') {
add_action( $tax_name . '_edit_form', '_category_image_option', 10, 2 );
}
}
}
function _category_image_option( $tag, $taxonomy ) {
$tax = get_taxonomy( $taxonomy );
?>
<h3><?php _e( 'Custom image for Category', 'marx' ); ?></h3>
<table class="form-table">
<tbody>
<tr class="form-field">
<th scope="row" valign="top"><label for="meta[doctitle]"><?php _e( 'Image link', 'marx' ); ?></label></th>
<td>
<input name="meta[doctitle]" id="meta[doctitle]" type="text" value="<?php echo esc_attr( $tag->meta['doctitle'] ); ?>" size="40" />
</td>
</tr>
</tbody>
</table>
<?php
}
add_action( 'edit_term', '_term_meta_save', 10, 2 );
function _term_meta_save( $term_id, $tt_id ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
$term_meta = (array) get_option( 'mx-category-meta' );
$term_meta[$term_id] = isset( $_POST['meta'] ) ? (array) $_POST['meta'] : array();
update_option( 'mx-category-meta', $term_meta );
}
add_action( 'delete_term', '_term_meta_delete', 10, 2 );
function _term_meta_delete( $term_id, $tt_id ) {
$term_meta = (array) get_option( 'mx-category-meta' );
unset( $term_meta[$term_id] );
update_option( 'mx-category-meta', (array) $term_meta );
}
Please wait me make page template (Category Images Grid) for you !
Martin Pham comments:
sory, im post wrong code. Correct here
<?php
function _get_custom_field( $field ) {
global $id, $post;
if ( null === $id && null === $post )
return false;
$post_id = null === $id ? $post->ID : $id;
$custom_field = get_post_meta( $post_id, $field, true );
if ( $custom_field )
return stripslashes( wp_kses_decode_entities( $custom_field ) );
return false;
}
add_action( 'admin_menu', '_add_inpage_category_box' );
function _add_inpage_category_box() {
foreach ( (array) get_post_types( array( 'public' => true ) ) as $type ) {
if($type == 'page')
add_meta_box( '_inpage_category_box', __( 'Select Category', 'marx' ), '_inpage_category_box', $type, 'normal', 'high' );
}
}
function _inpage_category_box() {
$categories = get_categories();
$current = _get_custom_field('_category_parent');
?>
<input type="hidden" name="_inpage_category_box_nonce" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
<p><label for="mx_category_parent"><?php _e( 'Select parent category', 'marx' ); ?></label></p>
<select name="marx[_category_parent]" id="mx_category_parent">
<option value="default" <?php selected( $current, 'default' ); ?> >Default</option>
<?php
foreach ($categories as $cat) {
echo '<option '. selected( $current, $cat->cat_ID ) .' value="'.$cat->cat_ID.'">'.$cat->cat_name.'</option>';
}
echo '</select>';
}
add_action( 'save_post', '_inpage_category_save', 1, 2 );
function _inpage_category_save($post_id, $post) {
if ( ! isset( $_POST['_inpage_category_box_nonce'] ) || ! wp_verify_nonce( $_POST['_inpage_category_box_nonce'], plugin_basename( __FILE__ ) ) )
return $post->ID;
/** Don't try to save the data under autosave, ajax, or future post */
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
if ( defined( 'DOING_CRON' ) && DOING_CRON )
return;
/** Don't try to store data during revision save */
if ( 'revision' == $post->post_type )
return;
$mx_category_parent = $_POST['marx'];
foreach ( (array) $mx_category_parent as $key => $value ) {
/** Save, or delete if the value is empty */
if ( $value != 'default')
update_post_meta( $post->ID, $key, $value );
else
delete_post_meta( $post->ID, $key );
}
}
/**
* Category term meta
*/
add_action( 'admin_init', '_add_taxonomy_image_options' );
function _add_taxonomy_image_options() {
foreach ( get_taxonomies( array( 'show_ui' => true ) ) as $tax_name ) {
if($tax_name == 'category') {
add_action( $tax_name . '_edit_form', '_category_image_option', 10, 2 );
}
}
}
function _category_image_option( $tag, $taxonomy ) {
$tax = get_taxonomy( $taxonomy );
?>
<h3><?php _e( 'Custom image for Category', 'marx' ); ?></h3>
<table class="form-table">
<tbody>
<tr class="form-field">
<th scope="row" valign="top"><label for="meta[cat_image_link]"><?php _e( 'Image link', 'marx' ); ?></label></th>
<td>
<input name="meta[cat_image_link]" id="meta[cat_image_link]" type="text" value="<?php echo esc_attr( $tag->meta['cat_image_link'] ); ?>" size="40" />
</td>
</tr>
</tbody>
</table>
<?php
}
add_action( 'edit_term', '_term_meta_save', 10, 2 );
function _term_meta_save( $term_id, $tt_id ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
$term_meta = (array) get_option( 'mx-category-meta' );
$term_meta[$term_id] = isset( $_POST['meta'] ) ? (array) $_POST['meta'] : array();
update_option( 'mx-category-meta', $term_meta );
}
add_action( 'delete_term', '_term_meta_delete', 10, 2 );
function _term_meta_delete( $term_id, $tt_id ) {
$term_meta = (array) get_option( 'mx-category-meta' );
unset( $term_meta[$term_id] );
update_option( 'mx-category-meta', (array) $term_meta );
}
tonepro1 comments:
Your code broke the site. Dreamweaver said there was a code syntax error.
Martin Pham comments:
no problem, it work fine.
please wait me to build template
Martin Pham comments:
Hello there,
I apologize for the delay, i have completed the requirements of the question. It works very well for me, you can see attached file.
insert this into functions.php . Please edit <strong>defaults image link</strong> for category in function <strong>_get_category_meta</strong>
<?php
function _get_category_meta($catid='') {
$term_meta = (array) get_option( 'mx-category-meta' );
if (array_key_exists($catid, $term_meta) && isset($term_meta[$catid]['cat_image_link'])) {
return esc_url($term_meta[$catid]['cat_image_link']);
}
else {
// insert default image link here
return 'http://domain.com/default_image.jpg';
}
}
function _get_custom_field( $field ) {
global $id, $post;
if ( null === $id && null === $post )
return false;
$post_id = null === $id ? $post->ID : $id;
$custom_field = get_post_meta( $post_id, $field, true );
if ( $custom_field )
return stripslashes( wp_kses_decode_entities( $custom_field ) );
return false;
}
add_action( 'admin_menu', '_add_inpage_category_box' );
function _add_inpage_category_box() {
foreach ( (array) get_post_types( array( 'public' => true ) ) as $type ) {
if($type == 'page')
add_meta_box( '_inpage_category_box', __( 'Grid Categories', 'marx' ), '_inpage_category_box', $type, 'normal', 'high' );
}
}
function _inpage_category_box() {
$categories = get_categories();
$current = _get_custom_field('_category_parent');
?>
<input type="hidden" name="_inpage_category_box_nonce" value="<?php echo wp_create_nonce( plugin_basename( __FILE__ ) ); ?>" />
<p><label for="mx_category_parent"><?php _e( 'Select parent category', 'marx' ); ?></label></p>
<select name="marx[_category_parent]" id="mx_category_parent">
<option value="default" <?php selected( $current, 'default' ); ?> >Default</option>
<?php
foreach ($categories as $cat) {
echo '<option '. selected( $current, $cat->cat_ID ) .' value="'.$cat->cat_ID.'">'.$cat->cat_name.'</option>';
}
echo '</select>';
}
add_action( 'save_post', '_inpage_category_save', 1, 2 );
function _inpage_category_save($post_id, $post) {
if ( ! isset( $_POST['_inpage_category_box_nonce'] ) || ! wp_verify_nonce( $_POST['_inpage_category_box_nonce'], plugin_basename( __FILE__ ) ) )
return $post->ID;
/** Don't try to save the data under autosave, ajax, or future post */
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
if ( defined( 'DOING_CRON' ) && DOING_CRON )
return;
/** Don't try to store data during revision save */
if ( 'revision' == $post->post_type )
return;
$mx_category_parent = $_POST['marx'];
foreach ( (array) $mx_category_parent as $key => $value ) {
/** Save, or delete if the value is empty */
if ( $value != 'default')
update_post_meta( $post->ID, $key, $value );
else
delete_post_meta( $post->ID, $key );
}
}
/**
* Category term meta
*/
add_action( 'admin_init', '_add_taxonomy_image_options' );
function _add_taxonomy_image_options() {
foreach ( get_taxonomies( array( 'show_ui' => true ) ) as $tax_name ) {
if($tax_name == 'category') {
add_action( $tax_name . '_edit_form', '_category_image_option', 10, 2 );
}
}
}
function _category_image_option( $tag, $taxonomy ) {
$tax = get_taxonomy( $taxonomy );
?>
<h3><?php _e( 'Custom image for Category', 'marx' ); ?></h3>
<table class="form-table">
<tbody>
<tr class="form-field">
<th scope="row" valign="top"><label for="meta[cat_image_link]"><?php _e( 'Image link', 'marx' ); ?></label></th>
<td>
<input name="meta[cat_image_link]" id="meta[cat_image_link]" type="text" value="<?php echo esc_attr( $tag->meta['cat_image_link'] ); ?>" size="40" />
</td>
</tr>
</tbody>
</table>
<?php
}
add_action( 'edit_term', '_term_meta_save', 10, 2 );
function _term_meta_save( $term_id, $tt_id ) {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
$term_meta = (array) get_option( 'mx-category-meta' );
$term_meta[$term_id] = isset( $_POST['meta'] ) ? (array) $_POST['meta'] : array();
update_option( 'mx-category-meta', $term_meta );
}
add_action( 'delete_term', '_term_meta_delete', 10, 2 );
function _term_meta_delete( $term_id, $tt_id ) {
$term_meta = (array) get_option( 'mx-category-meta' );
unset( $term_meta[$term_id] );
update_option( 'mx-category-meta', (array) $term_meta );
}
MAKE template file in theme folder (example: page-template-category-grid.php) then paste code bellow and edit your page style.
<?php
/**
* Template Name: Category Images Grid
*/
$parent_category = _get_custom_field('_category_parent');
$args = array(
'child_of' => ($parent_category) ? $parent_category : 0,
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 0,
'hierarchical' => 1,
'taxonomy' => 'category',
'pad_counts' => false );
$categories = get_categories( $args );
get_header();
# Display category
if($categories) {
// Display parent category name
$catname = get_cat_name($parent_category);
if($catname) {
echo '<h2 class="grid-cat-pr"><a href="'.get_category_link($parent_category).'" title="'.$catname.'">'.$catname.'</a></h2>';
}
// Display grid categories
$i = 0;
$each_row = 4;
echo '<ul class="cat-grid">';
foreach($categories as $category) {
$i++;
echo '<li '.(($i%$each_row == 0 && $i != 0) ? 'class="last"': '').'>
<a href="' . get_category_link( $category->term_id ) . '" title="' . $category->name . '" ' . '>
<img src="'. _get_category_meta($category->term_id) .'" width="150" height="150" />
<p class="cat-label">'.$category->name.'</p>
</a>
</li>';
}
echo '</ul>';
}
get_footer();
In-Demo Css
.cat-grid a, .grid-cat-pr a {
color: #fff;
}
.grid-cat-pr {
margin-bottom: 20px;
font-size: 20px;
}
.cat-grid li {
float: left;
border: 1px solid #CDCDCD;
padding: 4px;
background-color:#000;
margin-right: 15px;
margin-bottom: 20px;
}
.cat-grid .cat-label {
padding: 3px 0;
text-align: center;
}
.cat-grid .last {
margin-right: 0;
clear:both;
}