c8f482a02d
・ファイル名の綴りが間違っていたので修正 ・通常ソートのリスト表示位置が、有効/無効切り替えで変わるようJSとテンプレートのPHPファイルを修正
447 lines
15 KiB
PHP
447 lines
15 KiB
PHP
<?php
|
||
if ( ! defined( 'ABSPATH' ) ) {
|
||
exit;
|
||
} // Exit if accessed directly
|
||
|
||
if ( ! class_exists( 'APOP_UI' ) ) {
|
||
class APOP_UI {
|
||
|
||
public static function get_order_type( $type ) {
|
||
$type_data = get_option( $type );
|
||
if ( ! $type_data ) {
|
||
return 1;
|
||
}
|
||
|
||
return $type_data;
|
||
}
|
||
|
||
public static function get_all_search_normal_posts(
|
||
$key
|
||
): string {
|
||
$meta_key = '_apop_post_' . $key;
|
||
$args = self::create_search_normal_args( $meta_key );
|
||
$posts_data = get_posts( $args );
|
||
$list = [];
|
||
foreach ( $posts_data as $i => $post_data ) {
|
||
$order = $i + 1;
|
||
$no_order = self::is_sort_post_registered( $post_data->ID, $meta_key ) ? '' : ' no_order';
|
||
$list[] = '<li class="product-list' . $no_order . '">' . self::crate_non_registerd_mark( $no_order ) . '
|
||
<span class="sort-num-label">' . $order . '</span>' . $post_data->post_title . '
|
||
<input type="hidden" class="list_order" name="_apop_post_' . $key . '[post_sort][' . $post_data->ID . ']" value="' . $order . '">
|
||
</li>';
|
||
}
|
||
|
||
return implode( PHP_EOL, $list );
|
||
}
|
||
|
||
private static function crate_non_registerd_mark( $no_order ): string {
|
||
if ( ! empty( $no_order ) ) {
|
||
return '■';
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
private static function create_search_normal_args( $meta_key ): array {
|
||
return array(
|
||
'post_status' => array( 'publish', 'draft' ),
|
||
'posts_per_page' => - 1,
|
||
'orderby' => 'meta_value_num',
|
||
'order' => 'ASC',
|
||
'meta_query' => array(
|
||
'relation' => 'OR',
|
||
array(
|
||
'key' => $meta_key,
|
||
'compare' => 'EXISTS',
|
||
),
|
||
array(
|
||
'key' => $meta_key,
|
||
'compare' => 'NOT EXISTS',
|
||
),
|
||
),
|
||
);
|
||
}
|
||
|
||
private static function get_all_taxonomies( $key ) {
|
||
if ( $key !== 'taxonomy' ) {
|
||
return get_terms( array( 'taxonomy' => $key, 'get' => 'all' ) );
|
||
}
|
||
$all_custom_tax = get_taxonomies( array( 'public' => true, '_builtin' => false ) );
|
||
$custom_tax_list = [];
|
||
foreach ( $all_custom_tax as $custom_tax ) {
|
||
$custom_tax_list = array_merge( $custom_tax_list, get_terms( array(
|
||
'taxonomy' => $custom_tax,
|
||
'get' => 'all'
|
||
) ) );
|
||
}
|
||
|
||
return $custom_tax_list;
|
||
}
|
||
|
||
public static function get_cat_tag_list( $target, $key ): array {
|
||
$opt = get_option( '_apop_' . $target . '_order' );
|
||
|
||
if ( ! isset( $opt['target_cat'] ) ) {
|
||
return array();
|
||
}
|
||
|
||
if ( $key == 'taxonomy' ) {
|
||
return self::create_custom_tax_term( $opt );
|
||
} else {
|
||
return self::create_tax_term( $opt, $key );
|
||
}
|
||
}
|
||
|
||
private static function create_custom_tax_term( $opt ): array {
|
||
$tax_data = [];
|
||
foreach ( $opt['target_cat'] as $tax_id => $status ) {
|
||
//フラグが立っているカスタムタクソノミーは情報を取得する
|
||
if ( $status ) {
|
||
$args = array(
|
||
'taxonomy' => get_term( $tax_id )->taxonomy,
|
||
'hide_empty' => 0,
|
||
'include' => $tax_id,
|
||
);
|
||
$tax_data = array_merge( $tax_data, get_terms( $args ) );
|
||
|
||
}
|
||
}
|
||
if ( count( $tax_data ) > 0 ) {
|
||
return $tax_data;
|
||
}
|
||
|
||
return array();
|
||
}
|
||
|
||
private static function create_tax_term( $opt, $key ) {
|
||
$include = array();
|
||
foreach ( $opt['target_cat'] as $tax_id => $status ) {
|
||
//フラグが立っているタクソノミーIDを取得
|
||
if ( $status ) {
|
||
$include[] = $tax_id;
|
||
}
|
||
}
|
||
$include_tax = implode( ',', $include );
|
||
if ( ! empty( $include_tax ) ) {
|
||
$args = array(
|
||
'taxonomy' => $key,
|
||
'hide_empty' => 0,
|
||
'include' => $include_tax,
|
||
);
|
||
|
||
return get_terms( $args );
|
||
}
|
||
|
||
return array();
|
||
}
|
||
|
||
public static function create_order_list( $tax_data, $tax_key ): string {
|
||
$return_data = self::get_sort_post_list( $tax_data->term_id, $tax_key, $tax_data->taxonomy );
|
||
$list = [];
|
||
foreach ( $return_data['data'] as $key => $target_post ) {
|
||
$sort_num = $key + 1;
|
||
$no_order = self::is_sort_post_registered( $target_post->ID, $return_data['meta_key'] ) ? '' : ' no_order';
|
||
$list[] = '
|
||
<li class="product-list' . $no_order . '">' . self::crate_non_registerd_mark( $no_order ) . '<span class="sort-num-label">' . $sort_num . '</span>' . get_the_title( $target_post->ID ) . '
|
||
<input type="hidden" class="list_order"
|
||
name="_apop_post_' . self::create_post_sort_key( $tax_data->taxonomy, $tax_key ) . '[post_sort][' . $tax_data->term_id . '][' . $target_post->ID . ']"
|
||
value="' . $sort_num . '">
|
||
</li>';
|
||
}
|
||
|
||
return implode( PHP_EOL, $list );
|
||
}
|
||
|
||
private static function is_sort_post_registered( $id, $key ): bool {
|
||
if ( get_post_meta( $id, $key, true ) ) {
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
private static function get_sort_post_list( $tax_id, $search_param, $tax_name ): array {
|
||
$post_types = array( 'post' );
|
||
$custom_post_types = array_values( get_post_types( array( 'public' => true, '_builtin' => false ) ) );
|
||
$args = array(
|
||
'post_type' => array_merge( $post_types, $custom_post_types ),
|
||
'post_status' => array( 'publish', 'draft' ),
|
||
'posts_per_page' => - 1,
|
||
'orderby' => 'meta_value_num',
|
||
'order' => 'ASC',
|
||
);
|
||
$meta_key = '_apop_post_' . self::create_post_sort_key( $tax_name, $search_param ) . '_' . $tax_id;
|
||
self::create_sort_post_list_meta_query( $args, $meta_key );
|
||
self::create_post_tax_query( $args, $search_param, $tax_name, $tax_id );
|
||
|
||
return array(
|
||
'meta_key' => $meta_key,
|
||
'data' => get_posts( $args )
|
||
);
|
||
}
|
||
|
||
private static function create_sort_post_list_meta_query( &$args, $meta_key ) {
|
||
|
||
$args['meta_query'] = array(
|
||
'relation' => 'OR',
|
||
array(
|
||
'key' => $meta_key,
|
||
'compare' => 'EXISTS',
|
||
),
|
||
array(
|
||
'key' => $meta_key,
|
||
'compare' => 'NOT EXISTS',
|
||
),
|
||
);
|
||
}
|
||
|
||
public static function create_post_sort_key( $tax_name, $tax_key ) {
|
||
if ( $tax_key == 'taxonomy' ) {
|
||
return 'tax';
|
||
}
|
||
|
||
return $tax_name;
|
||
}
|
||
|
||
private static function create_post_tax_query( &$args, $key, $tax_name, $tax_id ) {
|
||
if ( $key == 'taxonomy' ) {
|
||
$args['tax_query'] = array(
|
||
array(
|
||
'taxonomy' => $tax_name,
|
||
'field' => 'term_id',
|
||
'terms' => $tax_id,
|
||
'include_children' => false
|
||
)
|
||
);
|
||
} else {
|
||
$args[ $key ] = $tax_id;
|
||
}
|
||
}
|
||
|
||
public static function create_cat_per_page( $opt_per_page, $type ): array {
|
||
$cat_per_page = $opt_per_page[ $type ] ?? 'default';
|
||
$checked = '';
|
||
$cat_per_page_num = '';
|
||
if ( isset( $opt_per_page[ $type ] ) ) {
|
||
if ( $opt_per_page[ $type ] != 'default'
|
||
&& $opt_per_page[ $type ] != '-1'
|
||
&& $opt_per_page[ $type ] != 'all' ) {
|
||
$checked = ' checked="checked"';
|
||
$cat_per_page_num = $cat_per_page;
|
||
}
|
||
}
|
||
|
||
return array(
|
||
'_per_page' => $cat_per_page,
|
||
'_checked' => $checked,
|
||
'_per_page_num' => $cat_per_page_num,
|
||
);
|
||
}
|
||
|
||
public static function disp_tax_setting( $key, $title, $order_name ) {
|
||
$tax_data = APOP_UI::get_all_taxonomies( $key );
|
||
if ( count( $tax_data ) > 0 ) {
|
||
$order_name = $order_name;
|
||
$order_tax = $key == 'post_tag' ? 'tag' : $key;
|
||
echo '<tr><th scope="row">' . $title . '設定</th><td>';
|
||
include APOP_PLUGIN_PATH . 'template/setting_parts_taxonomy.php';
|
||
echo '</td></tr>';
|
||
}
|
||
}
|
||
|
||
public static function create_tax_per_page( $opt_per_page, $type, $id ): array {
|
||
$cat_per_page = $opt_per_page[ $type ][ $id ] ?? 'default';
|
||
$checked = '';
|
||
$cat_per_page_num = '';
|
||
if ( isset( $opt_per_page[ $type ][ $id ] ) ) {
|
||
if ( $opt_per_page[ $type ][ $id ] != 'default'
|
||
&& $opt_per_page[ $type ][ $id ] != '-1'
|
||
&& $opt_per_page[ $type ][ $id ] != 'all' ) {
|
||
$checked = ' checked="checked"';
|
||
$cat_per_page_num = $cat_per_page;
|
||
}
|
||
}
|
||
|
||
return array(
|
||
'_per_page' => $cat_per_page,
|
||
'_checked' => $checked,
|
||
'_per_page_num' => $cat_per_page_num,
|
||
);
|
||
}
|
||
|
||
public static function create_search_normal_list( $type, $id = null ): array {
|
||
$name_keys = self::create_name_keys( $id, $type );
|
||
$name_key = $name_keys['name_key'];
|
||
$get_option_key = $name_keys['get_option_key'];
|
||
$order_param_base = get_option( $get_option_key );
|
||
$order_param = '';
|
||
if ( is_null( $id ) ) {
|
||
$order_param = $order_param_base;
|
||
}
|
||
if ( isset( $order_param_base[ $id ] ) ) {
|
||
$order_param = $order_param_base[ $id ];
|
||
}
|
||
$target_keys = self::set_search_normal_target_keys( $order_param );
|
||
$target_values = array(
|
||
'date' => '登録日',
|
||
'title' => 'タイトル',
|
||
'ID' => 'ID',
|
||
'modified' => '更新日',
|
||
'custom_field' => 'カスタムフィールド',
|
||
);
|
||
$list = array();
|
||
foreach ( $target_keys as $target_key ) {
|
||
$cnv_order_params = self::set_order_list_param( $order_param, $target_key );
|
||
$use = $cnv_order_params['use'];
|
||
$sort = $cnv_order_params['sort'];
|
||
$alert = $cnv_order_params['alert'];
|
||
$no_order_class = $cnv_order_params['no_order_class'];
|
||
$field_metakey_input = '';
|
||
if ( $target_key == 'custom_field' ) {
|
||
$meta_key = $cnv_order_params['custom_field']['meta_key'];
|
||
$value_type = $cnv_order_params['custom_field']['value_type'];
|
||
$field_metakey_input = self::create_custom_field_sort_type( $name_key, $target_key, $meta_key, $value_type );
|
||
$target_key_check_class = 'custom_field_check';
|
||
} else {
|
||
$target_key_check_class = 'sort_' . $target_key . '_check';
|
||
}
|
||
$list[] = '<li class="product-list' . $no_order_class . '">
|
||
<div class="product-list-type-label"><b>' . $target_values[ $target_key ] . '</b></div>
|
||
<div class="product-list-sort-type">
|
||
<label>
|
||
<input type="hidden" name="_' . $name_key . '[' . $target_key . '][use]" value="0"' . self::set_search_normal_checked( $use, 0 ) . '>
|
||
<span class="en_dis_label">有効</span>:<input class="' . $target_key_check_class . '" type="checkbox" name="_' . $name_key . '[' . $target_key . '][use]" value="1"' . self::set_search_normal_checked( $use, 1 ) . '>
|
||
</label>
|
||
<label>
|
||
<input class="order_param" type="radio"
|
||
name="_' . $name_key . '[' . $target_key . '][sort]"
|
||
value="1"' . self::set_search_normal_checked( $sort, 1 ) . '>昇順</label>
|
||
<label>
|
||
<input class="order_param" type="radio"
|
||
name="_' . $name_key . '[' . $target_key . '][sort]"
|
||
value="2"' . self::set_search_normal_checked( $sort, 2 ) . '>降順</label>
|
||
' . $field_metakey_input . '
|
||
</div>
|
||
</li>';
|
||
}
|
||
|
||
return array(
|
||
implode( PHP_EOL, $list ),
|
||
$alert
|
||
);
|
||
}
|
||
|
||
private static function create_custom_field_sort_type( $name_key, $target_key, $meta_key, $value_type ): string {
|
||
return '<div class="sort_custom_field">
|
||
<div class="sort_custom_field_inner"><div class="sort_custom_field_inner_label">カスタムフィールドキー:</div>
|
||
<input type="text" class="custom_field_key" name="_' . $name_key . '[' . $target_key . '][field][meta_key]" value="' . $meta_key . '">
|
||
</div>
|
||
<div class="sort_custom_field_inner">
|
||
<div class="sort_custom_field_inner_label">値タイプ:</div>
|
||
<label><input type="radio"
|
||
class="custom_field_meta_value"
|
||
name="_' . $name_key . '[' . $target_key . '][field][value_type]"
|
||
value="meta_value"' . self::set_search_normal_checked( $value_type, 'meta_value' ) . '>テキスト</label>
|
||
<label><input type="radio"
|
||
class="custom_field_meta_value"
|
||
name="_' . $name_key . '[' . $target_key . '][field][value_type]"
|
||
value="meta_value_num"' . self::set_search_normal_checked( $value_type, 'meta_value_num' ) . '>数値</label>
|
||
</div>
|
||
</div>';
|
||
}
|
||
|
||
private static function set_order_list_param( $order_param, $target_key ): array {
|
||
|
||
$param = array(
|
||
'use' => 0,
|
||
'sort' => 2,
|
||
'alert' => '<p>並べ替えを登録するには「変更を保存」をクリックしてください。</p>',
|
||
'no_order_class' => ' no_order',
|
||
);
|
||
if ( $target_key == 'custom_field' ) {
|
||
$param['custom_field'] = array(
|
||
'meta_key' => '',
|
||
'value_type' => 'meta_value',
|
||
);
|
||
}
|
||
|
||
if ( isset( $order_param[ $target_key ] ) ) {
|
||
$param = array(
|
||
'use' => $order_param[ $target_key ]['use'] ?? 0,
|
||
'sort' => $order_param[ $target_key ]['sort'] ?? 2,
|
||
'alert' => ! $order_param[ $target_key ]['use'] ? '<p>並べ替えを登録するには「変更を保存」をクリックしてください。</p>' : '',
|
||
'no_order_class' => ! $order_param[ $target_key ]['use'] ? ' no_order' : '',
|
||
);
|
||
if ( $target_key == 'custom_field' ) {
|
||
$param['custom_field'] = array(
|
||
'meta_key' => $order_param[ $target_key ]['field']['meta_key'] ?? '',
|
||
'value_type' => $order_param[ $target_key ]['field']['value_type'] ?? 'meta_value',
|
||
);
|
||
}
|
||
}
|
||
|
||
return $param;
|
||
|
||
}
|
||
|
||
private static function create_name_keys( $id, $type ): array {
|
||
if ( is_null( $id ) ) {
|
||
return array(
|
||
'name_key' => 'apop_' . $type . '_order_param',
|
||
'get_option_key' => '_' . 'apop_' . $type . '_order_param',
|
||
);
|
||
} else {
|
||
return array(
|
||
'name_key' => 'apop_tax_order_param[' . $id . ']',
|
||
'get_option_key' => '_apop_tax_order_param',
|
||
);
|
||
}
|
||
}
|
||
|
||
private static function set_search_normal_target_keys( $post_apop_search_order_param ) {
|
||
if ( $post_apop_search_order_param ) {
|
||
return array_keys( $post_apop_search_order_param );
|
||
}
|
||
|
||
return array(
|
||
'date',
|
||
'title',
|
||
'ID',
|
||
'modified',
|
||
'custom_field'
|
||
);
|
||
}
|
||
|
||
private static function set_search_normal_checked( $param, $default ): string {
|
||
if ( $param == $default ) {
|
||
return ' checked="checked"';
|
||
}
|
||
|
||
return '';
|
||
}
|
||
|
||
public static function input_post_filter( $var_name, $type ) {
|
||
if ( $type == 'array' ) {
|
||
return filter_input( INPUT_POST, $var_name, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
|
||
}
|
||
if ( $type == 'str' ) {
|
||
return filter_input( INPUT_POST, $var_name );
|
||
}
|
||
}
|
||
|
||
public static function is_disp_per_page( &$disp, $disp_per_page ) {
|
||
if ( $disp_per_page ) {
|
||
$disp = true;
|
||
}
|
||
}
|
||
|
||
public static function create_none_select_msg( $str ): string {
|
||
return '<p>並べ替えをカスタマイズする' . $str . 'は選択されていません。</p>';
|
||
}
|
||
|
||
public static function none_registered_alert_msg(): string {
|
||
return '<div class="no_registered_exp">■は未登録項目です。ドラッグして並び順を変更後に「変更を保存」をクリックしてください。</div>';
|
||
}
|
||
|
||
}
|
||
} |