diff --git a/blocks/src/pattern-list/block.json b/blocks/src/pattern-list/block.json index 4af8466..fc9a1c3 100644 --- a/blocks/src/pattern-list/block.json +++ b/blocks/src/pattern-list/block.json @@ -38,6 +38,13 @@ "type": "boolean", "default": true }, + "excluded_taxonomies": { + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, "pattern_id": { "type": "boolean", "default": true diff --git a/blocks/src/pattern-list/edit.js b/blocks/src/pattern-list/edit.js index bcd485e..f3e763e 100644 --- a/blocks/src/pattern-list/edit.js +++ b/blocks/src/pattern-list/edit.js @@ -9,9 +9,10 @@ import { RangeControl, __experimentalUnitControl as UnitControl, } from '@wordpress/components'; -import { useEffect } from '@wordpress/element'; +import { useEffect, useState } from '@wordpress/element'; import ServerSideRender from '@wordpress/server-side-render'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; +import apiFetch from '@wordpress/api-fetch'; export default function PostListEdit( props ) { const { attributes, setAttributes } = props; @@ -19,20 +20,21 @@ export default function PostListEdit( props ) { numberPosts, order, orderby, - display_author, //eslint-disable-line camelcase - display_date_publiched, //eslint-disable-line camelcase - display_date_modified, //eslint-disable-line camelcase - display_new, //eslint-disable-line camelcase - display_taxonomies, //eslint-disable-line camelcase - pattern_id, //eslint-disable-line camelcase - display_btn_view, //eslint-disable-line camelcase - display_btn_view_text, //eslint-disable-line camelcase - display_btn_copy, //eslint-disable-line camelcase - display_paged, //eslint-disable-line camelcase - display_image, //eslint-disable-line camelcase - thumbnail_size, //eslint-disable-line camelcase - new_date, //eslint-disable-line camelcase - new_text, //eslint-disable-line camelcase + display_author, + display_date_publiched, + display_date_modified, + display_new, + display_taxonomies, + excluded_taxonomies, + pattern_id, + display_btn_view, + display_btn_view_text, + display_btn_copy, + display_paged, + display_image, + thumbnail_size, + new_date, + new_text, colWidthMinMobile, colWidthMinTablet, colWidthMinPC, @@ -41,6 +43,7 @@ export default function PostListEdit( props ) { } = attributes; const blockProps = useBlockProps(); + const [taxonomies, setTaxonomies] = useState([]); useEffect(() => { if (display_new === undefined) setAttributes({ display_new: true }); @@ -62,9 +65,36 @@ export default function PostListEdit( props ) { if (!colWidthMinPC) setAttributes({ colWidthMinPC: '300px' }); if (!gap) setAttributes({ gap: '1.5rem' }); if (!gapRow) setAttributes({ gapRow: '1.5rem' }); + if (excluded_taxonomies) setAttributes({ excluded_taxonomies: [] }); + // Fetch taxonomies for vk-patterns + apiFetch({ path: '/wp/v2/taxonomies?type=vk-patterns' }).then((data) => { + const taxonomyList = Object.keys(data).map((key) => ({ + slug: key, + label: data[key].name, + })); + setTaxonomies(taxonomyList); + }); }, []); + const handleTaxonomyChange = (taxonomySlug) => { + const newExclusions = excluded_taxonomies.includes(taxonomySlug) + ? excluded_taxonomies.filter((item) => item !== taxonomySlug) + : [...excluded_taxonomies, taxonomySlug]; + setAttributes({ excluded_taxonomies: newExclusions }); + }; + + const handleDisplayTaxonomiesChange = (checked) => { + setAttributes({ display_taxonomies: checked }); + if (checked) { + // チェックがつけられたとき、すべてのタクソノミーを表示 + setAttributes({ excluded_taxonomies: [] }); + } else { + // チェックが外されたとき、すべてのタクソノミーを除外 + setAttributes({ excluded_taxonomies: taxonomies.map(t => t.slug) }); + } + }; + return ( <> @@ -149,7 +179,7 @@ export default function PostListEdit( props ) { setAttributes({ display_taxonomies: checked })} + onChange={handleDisplayTaxonomiesChange} /> - )}

{__('New mark option', 'vk-pattern-directory-creator')}

+ )} + {display_taxonomies && ( + <> +

{__('Exclude Taxonomies', 'vk-pattern-directory-creator')}

+ {taxonomies.map((taxonomy) => ( + handleTaxonomyChange(taxonomy.slug)} + /> + ))} + + )} +

{__('New mark option', 'vk-pattern-directory-creator')}

setAttributes({ new_date: parseInt(value) }) } @@ -228,7 +272,7 @@ export default function PostListEdit( props ) { /> setAttributes({ new_text: value })} />

{__('View Button Text', 'vk-pattern-directory-creator')}

@@ -276,4 +320,4 @@ export default function PostListEdit( props ) { ); -} +} \ No newline at end of file diff --git a/blocks/src/pattern-list/index.js b/blocks/src/pattern-list/index.js index 2783723..0ca6768 100644 --- a/blocks/src/pattern-list/index.js +++ b/blocks/src/pattern-list/index.js @@ -27,6 +27,7 @@ export const settings = { display_date_modified: false, display_new: true, display_taxonomies: true, + excluded_taxonomies: [], pattern_id: true, display_btn_view: true, display_btn_copy: true, diff --git a/blocks/src/pattern-list/index.php b/blocks/src/pattern-list/index.php index 27c0850..c8823a9 100644 --- a/blocks/src/pattern-list/index.php +++ b/blocks/src/pattern-list/index.php @@ -66,6 +66,13 @@ function vkpdc_add_pattern_list_block() { 'type' => 'boolean', 'default' => true, ), + 'excluded_taxonomies' => array( + 'type' => 'array', + 'default' => array(), + 'items' => array( + 'type' => 'string', + ), + ), 'pattern_id' => array( 'type' => 'boolean', 'default' => true, diff --git a/modules/content-archive-settings.php b/modules/content-archive-settings.php index a6be000..2fd4f6e 100644 --- a/modules/content-archive-settings.php +++ b/modules/content-archive-settings.php @@ -64,6 +64,7 @@ function vkpdc_get_default_options() { 'orderby' => __( 'date', 'vk-pattern-directory-creator' ), 'display_new' => 1, 'display_taxonomies' => 1, + 'excluded_taxonomies' => [], 'pattern_id' => 1, 'display_date_publiched'=> 1, 'display_date_modified' => 1, @@ -121,15 +122,23 @@ function vkpdc_save_options() { check_admin_referer( 'vkpdc_save_options', 'vkpdc_settings_nonce' ); $defaults = vkpdc_get_default_options(); - foreach ( vkpdc_get_default_options() as $key => $default ) { - $current_value = get_option( 'vkpdc_' . $key ); + // excluded_taxonomies の処理 + if ( isset( $_POST['excluded_taxonomies'] ) ) { + $excluded_taxonomies = $_POST['excluded_taxonomies']; // そのまま保存 + update_option( 'vkpdc_excluded_taxonomies', $excluded_taxonomies ); + // デバッグ用にログ出力 + error_log( 'Excluded taxonomies saved: ' . print_r( $excluded_taxonomies, true ) ); + } else { + update_option( 'vkpdc_excluded_taxonomies', [] ); // チェックが外された場合は空配列を保存 + // デバッグ用にログ出力 + error_log( 'Excluded taxonomies set to empty array.' ); } - // フック名の存在を検証 - if ( ! empty( $hook_name ) && ! has_filter( $hook_name ) ) { - wp_die( __( 'The specified hook is not valid.', 'vk-pattern-directory-creator' ) ); - } + // 保存後にデータベースから取得して確認 + $saved_excluded_taxonomies = get_option( 'vkpdc_excluded_taxonomies', [] ); + error_log( 'Current excluded taxonomies: ' . print_r( $saved_excluded_taxonomies, true ) ); + // チェックボックスの処理 $checkbox_fields = [ 'display_new', 'display_taxonomies', @@ -140,28 +149,27 @@ function vkpdc_save_options() { 'display_btn_view', 'display_btn_copy', ]; + + foreach ( $checkbox_fields as $key ) { + $value = isset( $_POST[ $key ] ) ? 1 : 0; + update_option( 'vkpdc_' . $key, $value ); + } - if ( isset( $_POST['reset'] ) ) { - foreach ( $defaults as $key => $value ) { - update_option( 'vkpdc_' . $key, $value ); - } - return __( 'Settings reset to default.', 'vk-pattern-directory-creator' ); - } else { - foreach ( $checkbox_fields as $key ) { - $value = isset( $_POST[ $key ] ) ? 1 : 0; + // その他のオプションの保存 + foreach ( $defaults as $key => $default ) { + if ( ! in_array( $key, $checkbox_fields, true ) ) { + $value = isset( $_POST[ $key ] ) ? sanitize_text_field( $_POST[ $key ] ) : $default; update_option( 'vkpdc_' . $key, $value ); } + } - foreach ( $defaults as $key => $default ) { - if ( ! in_array( $key, $checkbox_fields, true ) ) { - $value = isset( $_POST[ $key ] ) ? sanitize_text_field( $_POST[ $key ] ) : $default; - update_option( 'vkpdc_' . $key, $value ); - } - } + update_option('vkpdc_excluded_taxonomies', $excluded_taxonomies, false); + $excluded_taxonomies = get_option( 'vkpdc_excluded_taxonomies', [] ); - wp_cache_flush(); - return __( 'Settings saved.', 'vk-pattern-directory-creator' ); - } + + + wp_cache_flush(); + return __( 'Settings saved.', 'vk-pattern-directory-creator' ); } /** @@ -224,12 +232,13 @@ function vkpdc_execute_shortcode_on_hook() { $options = vkpdc_get_default_options(); $shortcode = sprintf( - '[vkpdc_archive_loop numberPosts="%d" order="%s" orderby="%s" display_new="%d" display_taxonomies="%d" pattern_id="%d" display_date_publiched="%d" display_date_modified="%d" display_author="%d" display_image="%s" thumbnail_size="%s" display_btn_view="%d" display_btn_copy="%d" display_btn_view_text="%s" new_date="%d" new_text="%s" colWidthMinMobile="%s" colWidthMinMobileTablet="%s" colWidthMinMobilePC="%s" gap="%s" gapRow="%s"]', + '[vkpdc_archive_loop numberPosts="%d" order="%s" orderby="%s" display_new="%d" display_taxonomies="%d" excluded_taxonomies="%s" pattern_id="%d" display_date_publiched="%d" display_date_modified="%d" display_author="%d" display_image="%s" thumbnail_size="%s" display_btn_view="%d" display_btn_copy="%d" display_btn_view_text="%s" new_date="%d" new_text="%s" colWidthMinMobile="%s" colWidthMinMobileTablet="%s" colWidthMinMobilePC="%s" gap="%s" gapRow="%s"]', intval( $options['numberPosts'] ), esc_attr( $options['order'] ), esc_attr( $options['orderby'] ), intval( $options['display_new'] ), intval( $options['display_taxonomies'] ), + esc_attr( $options['excluded_taxonomies'] ), intval( $options['pattern_id'] ), intval( $options['display_date_publiched'] ), intval( $options['display_date_modified'] ), @@ -284,6 +293,12 @@ function vkpdc_render_settings_page() { $options[ $key ] = get_option( 'vkpdc_' . $key, $default ); } + // タクソノミーの取得 + $taxonomies = get_taxonomies( array( 'object_type' => array( 'vk-patterns' ) ), 'objects' ); + + // 保存された excluded_taxonomies を取得 + $saved_excluded_taxonomies = get_option( 'vkpdc_excluded_taxonomies', [] ); + ?>

@@ -344,6 +359,15 @@ function vkpdc_render_settings_page() { + + + + + name, (array) $saved_excluded_taxonomies, true ) ); ?> /> +
+ + + diff --git a/modules/content-archive.php b/modules/content-archive.php index f8e7c90..7f59338 100644 --- a/modules/content-archive.php +++ b/modules/content-archive.php @@ -122,35 +122,36 @@ function vkpdc_render_post_item( $post = null, $attributes = [] ) { $has_taxonomies = ! empty( $attributes['display_taxonomies'] ); $has_pattern_id = ! empty( $attributes['pattern_id'] ); - if ( $has_taxonomies ) { - // タクソノミーの取得. - $args = array( - 'template' => '
%s
%l
', - 'term_template' => '%2$s', - ); - $taxonomies = get_the_taxonomies( $post->ID, $args ); - - // 除外するタクソノミー. - $exclusion = array( 'product_type', 'language' ); - $exclusion = apply_filters( 'vkpdc_archive_display_taxonomies_exclusion', $exclusion ); - - // 除外するタクソノミーを削除. - if ( is_array( $exclusion ) ) { - foreach ( $exclusion as $key => $value ) { - unset( $taxonomies[ $value ] ); - } + // 除外するタクソノミー + $excluded_taxonomies = get_option( 'vkpdc_excluded_taxonomies', [] ); // 除外するタクソノミーを取得 + $exclusion = apply_filters( 'vkpdc_archive_display_taxonomies_exclusion', + vkpdc_is_block_theme() ? $attributes['excluded_taxonomies'] : + (empty($attributes['excluded_taxonomies']) ? $excluded_taxonomies : $attributes['excluded_taxonomies']) + ); + + // タクソノミーの取得 + $args = array( + 'template' => '
%s
%l
', + 'term_template' => '%2$s', + ); + $taxonomies = get_the_taxonomies( $post->ID, $args ); + + // 除外するタクソノミーを削除 + if ( is_array( $exclusion ) ) { + foreach ( $exclusion as $key => $value ) { + unset( $taxonomies[ $value ] ); } - - $taxonomy_html .= '
'; + } + + $taxonomy_html .= '
'; - // タクソノミーごとにタームを表示 - if ( ! empty( $taxonomies ) ) { - foreach ( $taxonomies as $key => $value ) { - $taxonomy_html .= '
' . $value . '
'; - } + // タクソノミーごとにタームを表示 + if ( ! empty( $taxonomies ) ) { + foreach ( $taxonomies as $key => $value ) { + $taxonomy_html .= '
' . $value . '
'; } - $taxonomy_html .= '
'; } + $taxonomy_html .= '
'; // パターンIDはタクソノミーの有無に関わらず出力 if ( $has_pattern_id ) { @@ -604,4 +605,4 @@ function vkpdc_add_placeholder_articles( $query, $attributes ) { } return $html; -} \ No newline at end of file +}