Skip to content

Instantly share code, notes, and snippets.

@alinademi
Forked from igorbenic/example.php
Created March 3, 2021 22:10
Show Gist options
  • Save alinademi/a08c069f6fb7129190427267d367576d to your computer and use it in GitHub Desktop.
Save alinademi/a08c069f6fb7129190427267d367576d to your computer and use it in GitHub Desktop.
Taxonomy Rewrite Example
<?php
function rewriting_resources($wp_rewrite) {
$rules = array();
$terms = get_terms( array(
'taxonomy' => 'resource_type',
'hide_empty' => false,
) );
$post_type = 'resources';
foreach ($terms as $term) {
// Is it a child term?
if( $term->parent ) {
$ancestors = get_ancestors( $term->term_id, $taxonomy, 'taxonomy' );
foreach ( (array)$ancestors as $ancestor ) {
$ancestor_term = get_term($ancestor, $taxonomy);
$hierarchical_slugs[] = $ancestor_term->slug;
}
$hierarchical_slugs = array_reverse($hierarchical_slugs);
$hierarchical_slugs[] = $term->slug;
$rules['resources/' . implode('/', $hierarchical_slugs ) . '/([^/]*)$'] = 'index.php?post_type=' . $post_type. '&' . $post_type . '=$matches[1]&name=$matches[1]';
} else {
$rules['resources/' . $term->slug . '/([^/]*)$'] = 'index.php?post_type=' . $post_type. '&' . $post_type . '=$matches[1]&name=$matches[1]';
}
}
// merge with global rules
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'resources_cpt_generating_rule');
<?php
add_action(‘init’, ‘cpt_resources’);
function cpt_resources() {
$labels = array(
‘name’ => _x(‘Resources’, ‘snt’),
‘singular_name’ => _x(‘Resource’, ‘snt’),
‘add_new’ => _x(‘Add Resource’, ‘snt’),
‘add_new_item’ => __(‘Add Resource’),
‘edit_item’ => __(‘Edit Resource’),
‘new_item’ => __(‘New Resource’),
‘view_item’ => __(‘View Resource’),
‘search_items’ => __(‘Search Resources’),
‘not_found’ => __(‘Nothing found’),
‘not_found_in_trash’ => __(‘Nothing found in Trash’),
‘parent_item_colon’ => ”
);
$args = array(
‘labels’ => $labels,
‘taxonomies’ => array(‘resource_type’),
‘public’ => true,
‘publicly_queryable’ => true,
‘show_ui’ => true,
‘query_var’ => true,
‘rewrite’ => true,
‘capability_type’ => ‘post’,
‘hierarchical’ => false,
‘menu_position’ => null,
‘supports’ => array(‘title’,’thumbnail’, ‘editor’ ),
);
register_post_type( ‘resources_post_type’ , $args );
}
function resource_type() {
$labels = array(
‘name’ => _x( ‘Resource Types’, ‘Taxonomy General Name’, ‘snt’ ),
‘singular_name’ => _x( ‘Resource Type’, ‘Taxonomy Singular Name’, ‘snt’ ),
‘menu_name’ => __( ‘Resource Types’, ‘snt’ ),
‘all_items’ => __( ‘All Items’, ‘snt’ ),
‘parent_item’ => __( ‘Parent Item’, ‘snt’ ),
‘parent_item_colon’ => __( ‘Parent Item:’, ‘snt’ ),
‘new_item_name’ => __( ‘New Item Name’, ‘snt’ ),
‘add_new_item’ => __( ‘Add New Item’, ‘snt’ ),
‘edit_item’ => __( ‘Edit Item’, ‘snt’ ),
‘update_item’ => __( ‘Update Item’, ‘snt’ ),
‘view_item’ => __( ‘View Item’, ‘snt’ ),
‘separate_items_with_commas’ => __( ‘Separate items with commas’, ‘snt’ ),
‘add_or_remove_items’ => __( ‘Add or remove items’, ‘snt’ ),
‘choose_from_most_used’ => __( ‘Choose from the most used’, ‘snt’ ),
‘popular_items’ => __( ‘Popular Items’, ‘snt’ ),
‘search_items’ => __( ‘Search Items’, ‘snt’ ),
‘not_found’ => __( ‘Not Found’, ‘snt’ ),
‘no_terms’ => __( ‘No items’, ‘snt’ ),
‘items_list’ => __( ‘Items list’, ‘snt’ ),
‘items_list_navigation’ => __( ‘Items list navigation’, ‘snt’ ),
);
$args = array(
‘labels’ => $labels,
‘hierarchical’ => true,
‘public’ => true,
‘show_ui’ => true,
‘show_admin_column’ => true,
‘show_in_nav_menus’ => true,
‘show_tagcloud’ => true,
‘rewrite’ => array(‘slug’ => ‘resources’)
);
register_taxonomy( ‘resource_type’, array( ‘resources_post_type’ ), $args );
}
add_action( ‘init’, ‘resource_type’, 0 );
function rewriting_resources($wp_rewrite) {
$rules = array();
$terms = get_terms( array(
‘taxonomy’ => ‘resource_type’,
‘hide_empty’ => false,
) );
$post_type = ‘resources_post_type’;
foreach ( $terms as $term ) {
// Is it a child term?
if ( $term->parent ) {
$ancestors = get_ancestors( $term->term_id, $taxonomy, ‘taxonomy’ );
foreach ( (array)$ancestors as $ancestor ) {
$ancestor_term = get_term($ancestor, $taxonomy);
$hierarchical_slugs[] = $ancestor_term->slug;
}
$hierarchical_slugs = array_reverse($hierarchical_slugs);
$hierarchical_slugs[] = $term->slug;
$rules[‘resources/’ . implode(‘/’, $hierarchical_slugs ) . ‘/([^/]*)$’] = ‘index.php?post_type=’ . $post_type. ‘&’ . $post_type . ‘=$matches[1]&name=$matches[1]’;
} else {
$rules[‘resources/’ . $term->slug . ‘/([^/]*)$’] = ‘index.php?post_type=’ . $post_type. ‘&’ . $post_type . ‘=$matches[1]&name=$matches[1]’;
}
}
// merge with global rules
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter(‘generate_rewrite_rules’, ‘rewriting_resources’);
function change_link( $permalink, $post ) {
if ( $post->post_type == ‘resources_post_type’ ) {
$resource_terms = get_the_terms( $post, ‘resource_type’ );
$term_slug = ”;
if( ! empty( $resource_terms ) ) {
foreach ( $resource_terms as $term ) {
// The featured resource will have another category which is the main one
if( $term->slug == ‘featured’ ) {
continue;
}
$term_slug = $term->slug;
break;
}
}
$permalink = get_home_url() .”/resources/” . $term_slug . ‘/’ . $post->post_name;
}
return $permalink;
}
add_filter(‘post_type_link’,”change_link”,10,2);
this code in taxonomy-resource_type.php:
queried_object;
$taxonomy->children = get_terms( ‘resource_type’, array( ‘hide_empty’ => 0, ‘parent’ => $taxonomy->term_id, ‘orderby’ => ‘id’, ‘order’ => ‘ASC’, ) );
$parent = $taxonomy->parent;
$not_the_last_subcategory = is_array( $taxonomy->children ) && count( $taxonomy->children ) && $taxonomy->parent == 0;
?>
children);
?>
<div class="pr_subcategorias “>
children as $key=>$subcategory ) {
?>
<a href="”>name ?>
<a href="”>
description, false );
echo $description;
?>
<a href="”>
children = get_terms( ‘resource_type’, array(‘hide_empty’ => 0, ‘parent’ => $parent, ‘orderby’ => ‘id’, ‘order’ => ‘ASC’, ));
$columnas = count($taxonomy->children);
$current_category = get_query_var(‘resource_type’);
?>
<div class="pr_subcategorias_menu “>
name; ?>
children as $key=>$subcategory ) {
?>
<li class="th_subcategoria slug == $current_category ) echo ‘activo’; ?>”><a href="”>name ?>
$current_category,
‘post_type’ => ‘resources_post_type’,
‘posts_per_page’ => -1,
‘orderby’ => ‘menu_order’,
‘order’ => ‘ASC’,
‘no_found_rows’ => true // Si no hay paginacion, hace mas rapido la QUERY
)
);
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) {
$loop->the_post();
$pr_id = get_the_id();
$pr_image = wp_get_attachment_url( get_post_thumbnail_id( $pr_id ) );
?>
<img src="” alt=”” />
<a href="”>
And this in single-resources_post_type.php:
slug;
$current_father = $term[0]->parent;
$taxonomy->children = get_terms( ‘resource_type’, array( ‘hide_empty’ => 0, ‘parent’ => $current_father, ‘orderby’ => ‘id’, ‘order’ => ‘ASC’, ));
$columnas = count($taxonomy->children);
?>
<div class="pr_subcategorias_menu “>
children as $key=>$subcategory ) {
?>
<li class="th_subcategoria slug == $current_category ) echo ‘activo’; ?>”><a href="”>name ?>
CLIENTE:
SERVICIOS:
AÑO:
PAIS:
<div class="dcha “>
INFO
PROYECTOS RELACIONADOS
PREMIOS
VIDEOS
<?php
if ( get_the_content() ) echo '’ . get_the_content() . ”;
if ( $relaciones ) echo ” . $relaciones . ”;
if ( $premios ) echo ” . $premios . ”;
if ( $videos ) echo ” . $videos . ”;
?>
name . ‘ – ‘ . $current_category; ?>
$current_category,
‘post_type’ => ‘resources_post_type’,
‘post__not_in’ => array( $post_id ),
‘posts_per_page’ => -1,
‘orderby’ => ‘menu_order’,
‘order’ => ‘ASC’,
‘no_found_rows’ => true // Si no hay paginacion, hace mas rapido la QUERY
)
);
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) {
$loop->the_post();
$pr_id = get_the_id();
$pr_image = wp_get_attachment_url( get_post_thumbnail_id( $pr_id ) );
?>
<img src="” alt=”” />
<a href="”>
<?php
// Rewrites rules
add_action( 'generate_rewrite_rules', 'register_proyecto_rewrite_rules' );
function register_proyecto_rewrite_rules( $wp_rewrite ) {
$new_rules = array(
'proyecto/([^/]+)/?$' => 'index.php?proyecto-category=' . $wp_rewrite->preg_index( 1 ),
'proyecto/([^/]+)/([^/]+)/?$' => 'index.php?post_type=proyecto&proyecto-category=' . $wp_rewrite->preg_index( 1 ) . '&proyecto=' . $wp_rewrite->preg_index( 2 ),
'proyecto/([^/]+)/([^/]+)/page/(\d{1,})/?$' => 'index.php?post_type=proyecto&proyecto-category=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 3 ),
'proyecto/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?post_type=proyecto&proyecto-category=' . $wp_rewrite->preg_index( 2 ) . '&proyecto=' . $wp_rewrite->preg_index( 3 ),
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
// A hacky way of adding support for flexible custom permalinks
// There is one case in which the rewrite rules from register_kb_rewrite_rules() fail:
// When you visit the archive page for a child section(for example: http://example.com/proyecto/category/child-category)
// The deal is that in this situation, the URL is parsed as a Knowledgebase post with slug “child-category” from the “category” section
function fix_proyecto_subcategory_query($query) {
if ( isset( $query['post_type'] ) && 'proyecto' == $query['post_type'] ) {
if ( isset( $query['proyecto'] ) && $query['proyecto'] && isset( $query['proyecto-category'] ) && $query['proyecto-category'] ) {
$query_old = $query;
// Check if this is a paginated result(like search results)
if ( 'page' == $query['proyecto-category'] ) {
$query['paged'] = $query['name'];
unset( $query['proyecto-category'], $query['name'], $query['proyecto'] );
}
// Make it easier on the DB
$query['fields'] = 'ids';
$query['posts_per_page'] = 1;
// See if we have results or not
$_query = new WP_Query( $query );
if ( ! $_query->posts ) {
$query = array( 'proyecto-category' => $query['proyecto'] );
if ( isset( $query_old['proyecto-category'] ) && 'page' == $query_old['proyecto-category'] ) {
$query['paged'] = $query_old['name'];
}
}
}
}
return $query;
}
add_filter( 'request', 'fix_proyecto_subcategory_query', 10 );
function proyecto_article_permalink( $article_id, $section_id = false, $leavename = false, $only_permalink = false ) {
$taxonomy = 'proyecto-category';
$article = get_post( $article_id );
$return = 'post_type%' : $article->post_name ) );
$return .= $permalink . '/” >' . get_the_title( $article->ID ) . '';
return ( $only_permalink ) ? $permalink : $return;
}
function filter_proyecto_post_link( $permalink, $post, $leavename ) {
if ( get_post_type( $post->ID ) == 'proyecto' ) {
$terms = wp_get_post_terms( $post->ID, 'proyecto-category' );
$term = ( $terms ) ? $terms[0]->term_id : false;
$permalink = proyecto_article_permalink( $post->ID, $term, $leavename, true );
}
return $permalink;
}
add_filter( 'post_type_link', 'filter_proyecto_post_link', 100, 3 );
function filter_proyecto_section_terms_link( $termlink, $term, $taxonomy = false ) {
if ( $taxonomy == 'proyecto-category' ) {
$section_ancestors = get_ancestors( $term->term_id, $taxonomy );
krsort( $section_ancestors );
$termlink = home_url( '/proyecto/' );
foreach ( $section_ancestors as $ancestor ) {
$section_ancestor = get_term( $ancestor, $taxonomy );
$termlink .= $section_ancestor->slug . '/';
}
$termlink .= trailingslashit( $term->slug );
}
return $termlink;
}
add_filter( 'term_link', 'filter_proyecto_section_terms_link', 100, 3 );
add_action( 'template_redirect', 'my_fancy_template_redirect' );
function my_fancy_template_redirect(){
global $wp_query;
// Check if we are querying proyecto-posts:
if ( $wp_query->query_vars['post_type'] == 'proyecto' ) {
// Then check if we are dealing with a single proyecto post or just multiple proyecto posts:
if ( is_single() ) {
locate_template( array( 'templates/proyecto-single.php' ), true );
die();
}
}
}
<?php
function rewriting_resources($wp_rewrite) {
$rules = array();
$terms = get_terms( array(
'taxonomy' => 'resource_type',
'hide_empty' => false,
) );
$post_type = 'resources_cpt';
foreach ($terms as $term) {
// Is it a child term?
if( $term->parent ) {
$ancestors = get_ancestors( $term->term_id, $term->taxonomy, 'taxonomy' );
foreach ( (array)$ancestors as $ancestor ) {
$ancestor_term = get_term($ancestor, $term->taxonomy);
$hierarchical_slugs[] = $ancestor_term->slug;
}
$hierarchical_slugs = array_reverse($hierarchical_slugs);
$hierarchical_slugs[] = $term->slug;
$rules['resources/' . implode('/', $hierarchical_slugs ) . '/([^/]*)$'] = 'index.php?post_type=' . $post_type. '&' . $post_type . '=$matches[1]&name=$matches[1]';
} else {
$rules['resources/' . $term->slug . '/([^/]*)$'] = 'index.php?post_type=' . $post_type. '&' . $post_type . '=$matches[1]&name=$matches[1]';
}
}
// merge with global rules
$wp_rewrite->rules = $rules + $wp_rewrite->rules;
}
add_filter('generate_rewrite_rules', 'rewriting_resources');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment