Instantly share code, notes, and snippets.
Last active
August 29, 2015 14:16
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
-
Save torounit/635af1f32864ed280dda to your computer and use it in GitHub Desktop.
カスタムタクソノミーアーカイブの時に、get_term_linkが失敗するバグを修正。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /* | |
| Plugin Name: Prime Strategy Bread Crumb | |
| Plugin URI: http://www.warna.info/archives/1310/ | |
| Description: This plugin adds the function to display breadcrumbs (topic path) navigation. You can use display styles, lots of parameters of styles and original plugin hooks of breadcrumbs navigation, and you can customize navigations flexibly. | |
| Author: Hitoshi Omagari | |
| Version: 1.0.5 | |
| Author URI: http://www.warna.info/ | |
| License: GPLv2 or later | |
| Text Domain: ps-bread-crumb | |
| Domain Path: /language/ | |
| PHP Version: Require PHP5 | |
| */ | |
| class prime_strategy_bread_crumb{ | |
| function __construct() { | |
| add_action( 'plugins_loaded', array( &$this, 'load_textdomain' ) ); | |
| } | |
| public function load_textdomain() { | |
| load_plugin_textdomain( 'ps-bread-crumb', false, plugin_basename( dirname( __FILE__ ) ) . '/language' ); | |
| } | |
| public function bread_crumb( $args = '' ) { | |
| $default = array( | |
| 'type' => 'list', | |
| 'home_label' => __( 'Home', 'ps-bread-crumb' ), | |
| 'search_label' => __( 'Search Result of "%s"', 'ps-bread-crumb' ), | |
| '404_label' => __( '404 Not Found', 'ps-bread-crumb' ), | |
| 'category_label' => _x( '%s', 'category label', 'ps-bread-crumb' ), | |
| 'tag_label' => _x( '%s', 'tag label', 'ps-bread-crumb' ), | |
| 'taxonomy_label' => _x( '%s', 'taxonomy label', 'ps-bread-crumb' ), | |
| 'author_label' => _x( '%s', 'author label', 'ps-bread-crumb' ), | |
| 'attachment_label' => _x( '%s', 'attachment label', 'ps-bread-crumb' ), | |
| 'year_label' => _x( '%s', 'year label', 'ps-bread-crumb' ), | |
| 'month_label' => _x( '%s', 'month label', 'ps-bread-crumb' ), | |
| 'day_label' => _x( '%s', 'day label', 'ps-bread-crumb' ), | |
| 'post_type_label' => _x( '%s', 'post type label', 'ps-bread-crumb' ), | |
| 'joint_string' => __( ' > ', 'ps-bread-crumb' ), | |
| 'navi_element' => '', | |
| 'elm_class' => 'bread_crumb', | |
| 'elm_id' => '', | |
| 'li_class' => '', | |
| 'class_prefix' => '', | |
| 'current_class' => 'current', | |
| 'indent' => 0, | |
| 'echo' => true, | |
| ); | |
| $default = apply_filters( 'bread_crumb_default', $default ); | |
| $args = wp_parse_args( $args, $default ); | |
| $elm = in_array( $args['navi_element'], array( 'nav', 'div', '' ) ) ? $args['navi_element'] : 'div'; | |
| $args['elm_id'] = is_array( $args['elm_id'] ) ? $default['elm_id'] : $args['elm_id']; | |
| $args['elm_id'] = preg_replace( '/[^\w_-]+/', '', $args['elm_id'] ); | |
| $args['elm_id'] = preg_replace( '/^[\d_-]+/', '', $args['elm_id'] ); | |
| $args['class_prefix'] = is_array( $args['class_prefix'] ) ? $default['class_prefix'] : $args['class_prefix']; | |
| $args['class_prefix'] = preg_replace( '/[^\w_-]+/', '', $args['class_prefix'] ); | |
| $args['class_prefix'] = preg_replace( '/^[\d_-]+/', '', $args['class_prefix'] ); | |
| $args['elm_class'] = $this->sanitize_attr_classes( $args['elm_class'], $args['class_prefix'] ); | |
| $args['li_class'] = $this->sanitize_attr_classes( $args['li_class'], $args['class_prefix'] ); | |
| $args['current_class'] = $this->sanitize_attr_classes( $args['current_class'], $args['class_prefix'] ); | |
| $args['current_class'] = $args['current_class'] ? $args['current_class'] : $args['class_prefix'] . $default['current_class']; | |
| $args['echo'] = $this->uniform_boolean( $args['echo'], $default['echo'] ); | |
| $tabs = str_repeat( "\t", (int)$args['indent'] ); | |
| $bread_crumb_arr = $this->get_bread_crumb_array( $args ); | |
| $elm_attrs = ''; | |
| if ( $args['elm_id'] ) { | |
| $elm_attrs = ' id="' . $args['elm_id'] . '"'; | |
| } | |
| if ( $args['elm_class'] ) { | |
| $elm_attrs .= ' class="' . $args['elm_class'] . '"'; | |
| } | |
| $output = ''; | |
| $elm_tabs = ''; | |
| $output = ''; | |
| if ( $elm ) { | |
| $elm_tabs = "\t"; | |
| $output = $tabs . '<' . $elm; | |
| if ( $elm_attrs ) { | |
| $output .= $elm_attrs . ">\n"; | |
| } | |
| } | |
| if ( $args['type'] == 'string' ) { | |
| $output = array(); | |
| $cnt = 1; | |
| foreach ( $bread_crumb_arr as $ancestor ) { | |
| if ( $cnt == count( $bread_crumb_arr ) ) { | |
| $output[] = '<strong class="' . $args['current_class'] . '">' . apply_filters( 'the_title', $ancestor['title'] ) . '</strong>'; | |
| } else { | |
| $output[] = '<a href="' . $ancestor['link'] . '">' . apply_filters( 'the_title', $ancestor['title'] ) . '</a>'; | |
| } | |
| $cnt++; | |
| } | |
| $output = $elm_tabs . $tabs . implode( esc_html( $args['joint_string'] ), $output ); | |
| $output = apply_filters( 'bread_crumb_after', $output, $args ); | |
| } else { | |
| $output .= $elm_tabs . $tabs . '<ul'; | |
| if ( ! $elm && $elm_attrs ) { | |
| $output .= $elm_attrs; | |
| } | |
| $output .= ">\n"; | |
| $output = apply_filters( 'bread_crumb_before', $output, $args ); | |
| $cnt = 1; | |
| foreach ( $bread_crumb_arr as $ancestor ) { | |
| $classes = array(); | |
| $classes[] = $args['class_prefix'] . 'level-' . $cnt; | |
| if ( $cnt == 1 ) { | |
| $classes[] = $args['class_prefix'] . 'top'; | |
| } else { | |
| $classes[] = $args['class_prefix'] . 'sub'; | |
| } | |
| if ( $cnt == count( $bread_crumb_arr ) ) { | |
| $classes[] = $args['class_prefix'] . 'tail'; | |
| $output .= $elm_tabs . $tabs . ' <li class="' . implode( ' ', $classes ); | |
| if ( $args['li_class'] ) { | |
| $output .= ' ' . $args['li_class']; | |
| } | |
| $output .= ' ' . $args['current_class']; | |
| $output .= '">' . apply_filters( 'the_title', $ancestor['title'] ) . '</li>' . "\n"; | |
| } else { | |
| $output .= $elm_tabs . $tabs . ' <li class="' . implode( ' ', $classes ); | |
| if ( $args['li_class'] ) { | |
| $output .= ' ' . $args['li_class']; | |
| } | |
| $output .= '"><a href="' . $ancestor['link'] . '">' . apply_filters( 'the_title', $ancestor['title'] ) . '</a></li>' . "\n"; | |
| } | |
| $cnt++; | |
| } | |
| $output = apply_filters( 'bread_crumb_after', $output, $args ); | |
| $output .= $elm_tabs . $tabs . '</ul>' . "\n"; | |
| } | |
| if ( $elm ) { | |
| $output .= $tabs . '</' . $elm . ">\n"; | |
| } | |
| $output = apply_filters( 'bread_crumb', $output, $args ); | |
| if ( $args['echo'] ) { | |
| echo $output; | |
| } else { | |
| return $output; | |
| } | |
| } | |
| private function get_bread_crumb_array( $args ) { | |
| global $post; | |
| $bread_crumb_arr = array(); | |
| $bread_crumb_arr[] = array( 'title' => $args['home_label'], 'link' => get_bloginfo( 'url' ) . '/' ); | |
| $bread_crumb_arr = $this->add_posts_page_array( $bread_crumb_arr ); | |
| if ( is_404() ) { | |
| $bread_crumb_arr[] = array( 'title' => $args['404_label'], 'link' => false ); | |
| } elseif ( is_search() ) { | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['search_label'], get_search_query() ), 'link' => false ); | |
| } elseif ( is_tax() ) { | |
| $taxonomy = get_query_var( 'taxonomy' ); | |
| $term = get_term_by( 'slug', get_query_var( 'term' ), $taxonomy ); | |
| if ( is_taxonomy_hierarchical( $taxonomy ) && $term->parent != 0 ) { | |
| $ancestors = array_reverse( get_ancestors( $term->term_id, $taxonomy ) ); | |
| foreach ( $ancestors as $ancestor_id ) { | |
| $ancestor = get_term( $ancestor_id, $taxonomy ); | |
| $bread_crumb_arr[] = array( 'title' => $ancestor->name, 'link' => get_term_link( $ancestor, $taxonomy ) ); | |
| } | |
| } | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['taxonomy_label'], $term->name ), 'link' => get_term_link( $term->term_id, $taxonomy ) ); | |
| } elseif ( is_attachment() ) { | |
| if ( $post->post_parent ) { | |
| if ( $parent_post = get_post( $post->post_parent ) ) { | |
| $singular_bread_crumb_arr = $this->get_singular_bread_crumb_array( $parent_post, $args ); | |
| $bread_crumb_arr = array_merge( $bread_crumb_arr, $singular_bread_crumb_arr ); | |
| } | |
| } | |
| $bread_crumb_arr[] = array( 'title' => $parent_post->post_title, 'link' => get_permalink( $parent_post->ID ) ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['attachment_label'], $post->post_title ), 'link' => get_permalink( $post->ID ) ); | |
| } elseif ( is_singular() && ! is_front_page() ) { | |
| $singular_bread_crumb_arr = $this->get_singular_bread_crumb_array( $post, $args ); | |
| $bread_crumb_arr = array_merge( $bread_crumb_arr, $singular_bread_crumb_arr ); | |
| $bread_crumb_arr[] = array( 'title' => $post->post_title, 'link' => get_permalink( $post->ID ) ); | |
| } elseif ( is_category() ) { | |
| global $cat; | |
| $category = get_category( $cat ); | |
| if ( $category->parent != 0 ) { | |
| $ancestors = array_reverse( get_ancestors( $category->term_id, 'category' ) ); | |
| foreach ( $ancestors as $ancestor_id ) { | |
| $ancestor = get_category( $ancestor_id ); | |
| $bread_crumb_arr[] = array( 'title' => $ancestor->name, 'link' => get_category_link( $ancestor->term_id ) ); | |
| } | |
| } | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['category_label'], $category->name ), 'link' => get_category_link( $cat ) ); | |
| } elseif ( is_tag() ) { | |
| global $tag_id; | |
| $tag = get_tag( $tag_id ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['tag_label'], $tag->name ), 'link' => get_tag_link( $tag_id ) ); | |
| } elseif ( is_author() ) { | |
| $author = get_query_var( 'author' ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['author_label'], get_the_author_meta( 'display_name', get_query_var( 'author' ) ) ), 'link' => get_author_posts_url( $author ) ); | |
| } elseif ( is_day() ) { | |
| if ( $m = get_query_var( 'm' ) ) { | |
| $year = substr( $m, 0, 4 ); | |
| $month = substr( $m, 4, 2 ); | |
| $day = substr( $m, 6, 2 ); | |
| } else { | |
| $year = get_query_var( 'year' ); | |
| $month = get_query_var( 'monthnum' ); | |
| $day = get_query_var( 'day' ); | |
| } | |
| $month_title = $this->get_month_title( $month ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['year_label'], $year ), 'link' => get_year_link( $year ) ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['month_label'], $month_title ), 'link' => get_month_link( $year, $month ) ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['day_label'], $day ), 'link' => get_day_link( $year, $month, $day ) ); | |
| } elseif ( is_month() ) { | |
| if ( $m = get_query_var( 'm' ) ) { | |
| $year = substr( $m, 0, 4 ); | |
| $month = substr( $m, 4, 2 ); | |
| } else { | |
| $year = get_query_var( 'year' ); | |
| $month = get_query_var( 'monthnum' ); | |
| } | |
| $month_title = $this->get_month_title( $month ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['year_label'], $year ), 'link' => get_year_link( $year ) ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['month_label'], $month_title ), 'link' => get_month_link( $year, $month ) ); | |
| } elseif ( is_year() ) { | |
| if ( $m = get_query_var( 'm' ) ) { | |
| $year = substr( $m, 0, 4 ); | |
| } else { | |
| $year = get_query_var( 'year' ); | |
| } | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['year_label'], $year ), 'link' => get_year_link( $year ) ); | |
| } elseif ( is_post_type_archive() ) { | |
| $post_type = get_post_type_object( get_query_var( 'post_type' ) ); | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['post_type_label'], $post_type->label ), 'link' => get_post_type_archive_link( $post_type->name ) ); | |
| } | |
| return apply_filters( 'bread_crumb_arr', $bread_crumb_arr, $args ); | |
| } | |
| private function get_singular_bread_crumb_array( $post, $args ) { | |
| $bread_crumb_arr = array(); | |
| $post_type = get_post_type_object( $post->post_type ); | |
| if ( $post_type && $post_type->has_archive ) { | |
| $bread_crumb_arr[] = array( 'title' => sprintf( $args['post_type_label'], $post_type->label ), 'link' => get_post_type_archive_link( $post_type->name ) ); | |
| } | |
| if ( is_post_type_hierarchical( $post_type->name ) ) { | |
| $ancestors = array_reverse( get_post_ancestors( $post ) ); | |
| if ( count( $ancestors ) ) { | |
| $ancestor_posts = get_posts( 'post_type=' . $post_type->name . '&include=' . implode( ',', $ancestors ) ); | |
| foreach( $ancestors as $ancestor ) { | |
| foreach ( $ancestor_posts as $ancestor_post ) { | |
| if ( $ancestor == $ancestor_post->ID ) { | |
| $bread_crumb_arr[] = array( 'title' => apply_filters( 'the_title', $ancestor_post->post_title ), 'link' => get_permalink( $ancestor_post->ID ) ); | |
| } | |
| } | |
| } | |
| } | |
| } else { | |
| $post_type_taxonomies = get_object_taxonomies( $post_type->name, false ); | |
| if ( is_array( $post_type_taxonomies ) && count( $post_type_taxonomies ) ) { | |
| foreach( $post_type_taxonomies as $tax_slug => $taxonomy ) { | |
| if ( $taxonomy->hierarchical ) { | |
| $terms = get_the_terms( $post->ID, $tax_slug ); | |
| if ( $terms ) { | |
| $term = array_shift( $terms ); | |
| if ( $term->parent != 0 ) { | |
| $ancestors = array_reverse( get_ancestors( $term->term_id, $tax_slug ) ); | |
| foreach ( $ancestors as $ancestor_id ) { | |
| $ancestor = get_term( $ancestor_id, $tax_slug ); | |
| $bread_crumb_arr[] = array( 'title' => $ancestor->name, 'link' => get_term_link( $ancestor, $tax_slug ) ); | |
| } | |
| } | |
| $bread_crumb_arr[] = array( 'title' => $term->name, 'link' => get_term_link( $term, $tax_slug ) ); | |
| break; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return $bread_crumb_arr; | |
| } | |
| private function add_posts_page_array( $bread_crumb_arr ) { | |
| if ( is_page() || is_front_page() ) { | |
| return $bread_crumb_arr; | |
| } elseif ( is_category() ) { | |
| $tax = get_taxonomy( 'category' ); | |
| if ( count( $tax->object_type ) != 1 || $tax->object_type[0] != 'post' ) { | |
| return $bread_crumb_arr; | |
| } | |
| } elseif ( is_tag() ) { | |
| $tax = get_taxonomy( 'post_tag' ); | |
| if ( count( $tax->object_type ) != 1 || $tax->object_type[0] != 'post' ) { | |
| return $bread_crumb_arr; | |
| } | |
| } elseif ( is_tax() ) { | |
| $tax = get_taxonomy( get_query_var( 'taxonomy' ) ); | |
| if ( count( $tax->object_type ) != 1 || $tax->object_type[0] != 'post' ) { | |
| return $bread_crumb_arr; | |
| } | |
| } elseif ( is_home() && ! get_query_var( 'pagename' ) ) { | |
| return $bread_crumb_arr; | |
| } else { | |
| $post_type = get_query_var( 'post_type' ) ? get_query_var( 'post_type' ) : 'post'; | |
| if ( $post_type != 'post' ) { | |
| return $bread_crumb_arr; | |
| } | |
| } | |
| if ( get_option( 'show_on_front' ) == 'page' && $posts_page_id = get_option( 'page_for_posts' ) ) { | |
| $posts_page = get_post( $posts_page_id ); | |
| $bread_crumb_arr[] = array( 'title' => $posts_page->post_title, 'link' => get_permalink( $posts_page->ID ) ); | |
| } | |
| return $bread_crumb_arr; | |
| } | |
| private function sanitize_attr_classes( $classes, $prefix = '' ) { | |
| if ( ! is_array( $classes ) ) { | |
| $classes = preg_replace( '/[^\s\w_-]+/', '', $classes ); | |
| $classes = preg_split( '/[\s]+/', $classes ); | |
| } | |
| foreach ( $classes as $key => $class ) { | |
| if ( is_array( $class ) ) { | |
| unset( $classes[$key] ); | |
| } else { | |
| $class = preg_replace( '/[^\w_-]+/', '', $class ); | |
| $class = preg_replace( '/^[\d_-]+/', '', $class ); | |
| if ( $class ) { | |
| $classes[$key] = $prefix . $class; | |
| } | |
| } | |
| } | |
| $classes = implode( ' ', $classes ); | |
| return $classes; | |
| } | |
| private function uniform_boolean( $arg, $default = true ) { | |
| if ( is_numeric( $arg ) ) { | |
| $arg = (int)$arg; | |
| } | |
| if ( is_string( $arg ) ) { | |
| $arg = strtolower( $arg ); | |
| if ( $arg == 'false' ) { | |
| $arg = false; | |
| } elseif ( $arg == 'true' ) { | |
| $arg = true; | |
| } else { | |
| $arg = $default; | |
| } | |
| } | |
| return $arg; | |
| } | |
| private function get_month_title( $monthnum = 0 ) { | |
| global $wp_locale; | |
| $monthnum = (int)$monthnum; | |
| $date_format = get_option( 'date_format' ); | |
| if ( in_array( $date_format, array( 'DATE_COOKIE', 'DATE_RFC822', 'DATE_RFC850', 'DATE_RFC1036', 'DATE_RFC1123', 'DATE_RFC2822', 'DATE_RSS' ) ) ) { | |
| $month_format = 'M'; | |
| } elseif ( in_array( $date_format, array( 'DATE_ATOM', 'DATE_ISO8601', 'DATE_RFC3339', 'DATE_W3C' ) ) ) { | |
| $month_format = 'm'; | |
| } else { | |
| preg_match( '/(^|[^\\\\]+)(F|m|M|n)/', str_replace( '\\\\', '', get_option( 'date_format' ) ), $m ); | |
| if ( isset( $m[2] ) ) { | |
| $month_format = $m[2]; | |
| } else { | |
| $month_format = 'F'; | |
| } | |
| } | |
| switch ( $month_format ) { | |
| case 'F' : | |
| $month = $wp_locale->get_month( $monthnum ); | |
| break; | |
| case 'M' : | |
| $month = $wp_locale->get_month_abbrev( $wp_locale->get_month( $monthnum ) ); | |
| break; | |
| default : | |
| $month = $monthnum; | |
| } | |
| return $month; | |
| } | |
| } // class end | |
| $prime_strategy_bread_crumb = new prime_strategy_bread_crumb(); | |
| if ( ! function_exists( 'bread_crumb' ) ) { | |
| function bread_crumb( $args = '' ) { | |
| global $prime_strategy_bread_crumb; | |
| return $prime_strategy_bread_crumb->bread_crumb( $args ); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment