Skip to content

Commit

Permalink
Merge pull request #33 from vektor-inc/feature/checked-taxonomies
Browse files Browse the repository at this point in the history
特定のタクソノミーを除外する機能追加
  • Loading branch information
mtdkei authored Jan 21, 2025
2 parents 2a0d523 + 5054a1b commit 59224f9
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 70 deletions.
7 changes: 7 additions & 0 deletions blocks/src/pattern-list/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@
"type": "boolean",
"default": true
},
"excluded_taxonomies": {
"type": "array",
"default": [],
"items": {
"type": "string"
}
},
"pattern_id": {
"type": "boolean",
"default": true
Expand Down
84 changes: 64 additions & 20 deletions blocks/src/pattern-list/edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,32 @@ 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;
const {
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,
Expand All @@ -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 });
Expand All @@ -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 (
<>
<InspectorControls>
Expand Down Expand Up @@ -149,7 +179,7 @@ export default function PostListEdit( props ) {
<CheckboxControl
label={__('Taxonomies(all)', 'vk-pattern-directory-creator')}
checked={display_taxonomies}
onChange={(checked) => setAttributes({ display_taxonomies: checked })}
onChange={handleDisplayTaxonomiesChange}
/>
<CheckboxControl
label={__('Pattern ID', 'vk-pattern-directory-creator')}
Expand Down Expand Up @@ -214,21 +244,35 @@ export default function PostListEdit( props ) {
]}
/>
</BaseControl>
)} <h4>{__('New mark option', 'vk-pattern-directory-creator')}</h4>
)}
{display_taxonomies && (
<>
<h4>{__('Exclude Taxonomies', 'vk-pattern-directory-creator')}</h4>
{taxonomies.map((taxonomy) => (
<CheckboxControl
key={taxonomy.slug}
label={taxonomy.label}
checked={excluded_taxonomies.includes(taxonomy.slug)}
onChange={() => handleTaxonomyChange(taxonomy.slug)}
/>
))}
</>
)}
<h4>{__('New mark option', 'vk-pattern-directory-creator')}</h4>
<TextControl
label={__(
'Number of days to display the new post mark',
'vk-pattern-directory-creator'
)}
value={new_date} //eslint-disable-line camelcase
value={new_date}
onChange={(value) =>
setAttributes({ new_date: parseInt(value) })
}
type={'number'}
/>
<TextControl
label={__('New post mark', 'vk-pattern-directory-creator')}
value={new_text} //eslint-disable-line camelcase
value={new_text}
onChange={(value) => setAttributes({ new_text: value })}
/>
<h4>{__('View Button Text', 'vk-pattern-directory-creator')}</h4>
Expand Down Expand Up @@ -276,4 +320,4 @@ export default function PostListEdit( props ) {
</div>
</>
);
}
}
1 change: 1 addition & 0 deletions blocks/src/pattern-list/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
7 changes: 7 additions & 0 deletions blocks/src/pattern-list/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
72 changes: 48 additions & 24 deletions modules/content-archive-settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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',
Expand All @@ -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' );
}

/**
Expand Down Expand Up @@ -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'] ),
Expand Down Expand Up @@ -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', [] );

?>
<div class="wrap">
<h1><?php esc_html_e( 'Archive Setting', 'vk-pattern-directory-creator' ); ?></h1>
Expand Down Expand Up @@ -344,6 +359,15 @@ function vkpdc_render_settings_page() {
</td>
</tr>
<?php endforeach; ?>
<tr>
<th><?php esc_html_e( 'Exclude Taxonomies', 'vk-pattern-directory-creator' ); ?></th>
<td>
<?php foreach ( $taxonomies as $taxonomy ) : ?>
<input type="checkbox" id="excluded_taxonomy_<?php echo esc_attr( $taxonomy->name ); ?>" name="excluded_taxonomies[]" value="<?php echo esc_attr( $taxonomy->name ); ?>" <?php checked( in_array( $taxonomy->name, (array) $saved_excluded_taxonomies, true ) ); ?> />
<label for="excluded_taxonomy_<?php echo esc_attr( $taxonomy->name ); ?>"><?php echo esc_html( $taxonomy->label ); ?></label><br />
<?php endforeach; ?>
</td>
</tr>
<tr>
<th><label for="display_image"><?php esc_html_e( 'Display Image', 'vk-pattern-directory-creator' ); ?></label></th>
<td>
Expand Down
53 changes: 27 additions & 26 deletions modules/content-archive.php
Original file line number Diff line number Diff line change
Expand Up @@ -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' => '<dt class="vkpdc_post_taxonomy_title"><span class="vkpdc_post_taxonomy_title_inner">%s</span></dt><dd class="vkpdc_post_taxonomy_contents">%l</dd>',
'term_template' => '<a href="%1$s">%2$s</a>',
);
$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' => '<dt class="vkpdc_post_taxonomy_title"><span class="vkpdc_post_taxonomy_title_inner">%s</span></dt><dd class="vkpdc_post_taxonomy_contents">%l</dd>',
'term_template' => '<a href="%1$s">%2$s</a>',
);
$taxonomies = get_the_taxonomies( $post->ID, $args );

// 除外するタクソノミーを削除
if ( is_array( $exclusion ) ) {
foreach ( $exclusion as $key => $value ) {
unset( $taxonomies[ $value ] );
}

$taxonomy_html .= '<div class="vkpdc_post_taxonomies">';
}

$taxonomy_html .= '<div class="vkpdc_post_taxonomies">';

// タクソノミーごとにタームを表示
if ( ! empty( $taxonomies ) ) {
foreach ( $taxonomies as $key => $value ) {
$taxonomy_html .= '<dl class="vkpdc_post_taxonomy vkpdc_post_taxonomy-' . $key . '">' . $value . '</dl>';
}
// タクソノミーごとにタームを表示
if ( ! empty( $taxonomies ) ) {
foreach ( $taxonomies as $key => $value ) {
$taxonomy_html .= '<dl class="vkpdc_post_taxonomy vkpdc_post_taxonomy-' . $key . '">' . $value . '</dl>';
}
$taxonomy_html .= '</div>';
}
$taxonomy_html .= '</div>';

// パターンIDはタクソノミーの有無に関わらず出力
if ( $has_pattern_id ) {
Expand Down Expand Up @@ -604,4 +605,4 @@ function vkpdc_add_placeholder_articles( $query, $attributes ) {
}

return $html;
}
}

0 comments on commit 59224f9

Please sign in to comment.