// コレクションの重複を削除
function collection_uniq($collection) {
$keys = $collection;
for ($i = 0; $i < $N; $i++) {
$key = 'KEY' . mt_rand(1, $R);
if (!in_array($key, $keys)) {
$keys[] = $key;
}
}
return $keys;
}
// 配列をフラットにする
function array_flatten(array $arr) {
$ret = array();
foreach ($arr as $item) {
if (is_array($item)) {
$ret = array_merge($ret, array_flatten($item));
} else {
$ret[] = $item;
}
}
return $ret;
}
// 明確なテンプレートが存在しない場合に親のテンプレートを使用する。
function my_category_template( $template ) {
$category = get_queried_object();
if ( $category->parent != 0 &&
( $template == "" || strpos( $template, "category.php" ) !== false ) ) {
$templates = array();
while ( $category->parent ) {
$category = get_category( $category->parent );
if ( !isset( $category->slug ) ) break;
$templates[] = "category-{$category->slug}.php";
$templates[] = "category-{$category->term_id}.php";
}
$templates[] = "category.php";
$template = locate_template( $templates );
}
return $template;
}
add_filter( 'category_template', 'my_category_template' );
// 投稿のタグ表示をカテゴリライクのスタイルに変更する。
function re_register_post_tag_taxonomy() {
global $wp_rewrite;
$rewrite = array(
'slug' => get_option('tag_base') ? get_option('tag_base') : 'tag',
'with_front' => ! get_option('tag_base') || $wp_rewrite->using_index_permalinks(),
'ep_mask' => EP_TAGS,
);
$labels = array(
'name' => _x( 'Tags', 'taxonomy general name' ),
'singular_name' => _x( 'Tag', 'taxonomy singular name' ),
'search_items' => __( 'Search Tags' ),
'popular_items' => __( 'Popular Tags' ),
'all_items' => __( 'All Tags' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit Tag' ),
'view_item' => __( 'View Tag' ),
'update_item' => __( 'Update Tag' ),
'add_new_item' => __( 'Add New Tag' ),
'new_item_name' => __( 'New Tag Name' ),
'separate_items_with_commas' => __( 'Separate tags with commas' ),
'add_or_remove_items' => __( 'Add or remove tags' ),
'choose_from_most_used' => __( 'Choose from the most used tags' ),
'not_found' => __( 'No tags found.' )
);
register_taxonomy( 'post_tag', 'post', array(
'hierarchical' => true,
'query_var' => 'tag',
'rewrite' => $rewrite,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'_builtin' => true,
'labels' => $labels
) );
}
add_action( 'init', 're_register_post_tag_taxonomy', 1 );
// タグ別記事一覧を取得
function get_tag_posts($tag, $page) {
$args = array(
'tag__in' => $tag->term_id,
'posts_per_page' => $page,
'post_status' => 'publish',
);
$tag_posts = new WP_Query( $args );
return $tag_posts->posts;
}
// 記事のサブカテゴリ一覧を取得
function get_post_subcategories( $post_id ) {
$sub_categories = array();
$categories = get_the_category($post_id);
foreach ($categories as $key => $category) {
if ($category->parent) {
$sub_categories[$key] = $category;
}
}
return $sub_categories;
}
// WordPress ContactForm7 動的なオリジナルのフォームタグ
// Contact Form 7 が導入されていて wpcf7_add_form_tag が有効な場合のみ
if( function_exists('wpcf7_add_form_tag') ) {
// ※タグを出力するfunctionを先に記述していないと上手く動作しない
function make_talent_select_tag($tag) {
// 基本的な設定は参考にするタグの出力の仕方を参考に
$t = new WPCF7_Shortcode($tag);
$atts = array();
$class = wpcf7_form_controls_class( $tag->type );
$atts['class'] = $tag->get_class_option( $class );
$atts['id'] = $tag->get_id_option();
$atts['name'] = $tag->name;
$name = sanitize_html_class( $atts['name'] );
if ( $tag->is_required() ) {
$atts['aria-required'] = 'true';
}
$atts['aria-invalid'] = $validation_error ? 'true' : 'false';
// デフォルト選択 selected:値 というオプションがあれば該当するoptionタグを selected にする
$default = $tag->get_option( 'selected', '', true );
// first_as_label オプションで先頭を未選択状態の文字を表示できるようにする
$first_as_label = $tag->has_option( 'first_as_label' );
$values = $tag->values;
$options = '';
if( $first_as_label && count($values)) {
$options = '<option value>' . esc_html($values[0]) . '</option>';
}
// タレント名一覧を取得してセレクトタグのオプションにする
$talents = get_talent_name_list();
foreach($talents as $val) {
$value = esc_attr($val);
$selected = "";
// デフォルト選択に該当している場合 selected 属性を出力する
if( $default == $value) {
$selected = ' selected="selected"';
}
$options .= '<option value="' . $value . '"' . $selected . '>' . esc_html($val) . '</option>';
}
$atts = wpcf7_format_atts( $atts );
$html = sprintf(
'<span class="wpcf7-form-control-wrap %1$s"><select %2$s>%3$s</select></span>',
$name, $atts, $options
);
// 出力するタグのHTMLを返す
return $html;
}
// ショートコードなどを登録
wpcf7_add_form_tag(array('select_talent_list', 'select_talent_list*'),
'make_talent_select_tag',
array(
'name-attr' => true,
'selectable-values' => true,
)
);
// バリデーションは 元の select のものを利用
add_filter( 'wpcf7_validate_select_talent_list', 'wpcf7_select_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_select_talent_list*', 'wpcf7_select_validation_filter', 10, 2 );
}
// カスタム投稿タイプ `talent` のタイトル(名前)を返す
function get_talent_name_list() {
$data = array();
$args = array(
'post_type' => 'requirements',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => array(
'menu_order' => 'DESC',
'date' => 'ASC',
),
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$talentName = get_the_title();
$data[] = $talentName;
}
}
// reset query
wp_reset_postdata();
return $data;
}
// カスタムフィールドの内容をカラムに追加する
// 「商品タイプ」カラムを追加する
function manage_posts_columns($columns) {
$columns['type'] = '商品タイプ';
return $columns;
}
add_filter( 'manage_edit-products_columns', 'manage_posts_columns' );
// カスタムフィールドの内容を表示
function add_column($column_name, $post_id) {
if( $column_name == 'type' ) {
$stitle = get_post_meta($post_id, 'type', true);
}
if ( isset($stitle) && $stitle ) {
echo attribute_escape($stitle);
} else {
echo __('None');
}
}
add_action( 'manage_posts_custom_column', 'add_column', 10, 2 );