new file: olm-login.php
This commit is contained in:
@@ -19,107 +19,153 @@ final class ProductsPage
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h1><?php esc_html_e('Documentation Products', 'kb-markdown-importer'); ?></h1>
|
||||
<p><?php esc_html_e('Manage imported products, repair their URL slugs, or remove a broken import from the frontend.', 'kb-markdown-importer'); ?></p>
|
||||
<p><?php esc_html_e('Manage imported products, group them into frontend products, and assign categories.', 'kb-markdown-importer'); ?></p>
|
||||
<?php settings_errors('kb_markdown_products'); ?>
|
||||
|
||||
<table class="widefat striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?php esc_html_e('Product', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Slug', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Versions', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Pages', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Actions', 'kb-markdown-importer'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (! $products) : ?>
|
||||
<tr><td colspan="5"><?php esc_html_e('No products have been imported yet.', 'kb-markdown-importer'); ?></td></tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($products as $item) : ?>
|
||||
<?php
|
||||
$term = $item['term'];
|
||||
$formId = 'kb-markdown-product-' . (int) $term->term_id;
|
||||
$versions = array_map(static fn (\WP_Term $version): string => $version->name, (array) $item['versions']);
|
||||
?>
|
||||
<form method="post" action="">
|
||||
<?php wp_nonce_field('kb_markdown_save_all_products'); ?>
|
||||
<table class="widefat striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<input form="<?php echo esc_attr($formId); ?>" class="regular-text" type="text" name="product_name" value="<?php echo esc_attr($term->name); ?>" aria-label="<?php esc_attr_e('Product name', 'kb-markdown-importer'); ?>">
|
||||
</td>
|
||||
<td>
|
||||
<input form="<?php echo esc_attr($formId); ?>" class="regular-text" type="text" name="product_slug" value="<?php echo esc_attr($term->slug); ?>" aria-label="<?php esc_attr_e('Product slug', 'kb-markdown-importer'); ?>">
|
||||
</td>
|
||||
<td><?php echo esc_html($versions ? implode(', ', $versions) : __('No versions', 'kb-markdown-importer')); ?></td>
|
||||
<td><?php echo esc_html((string) $item['page_count']); ?></td>
|
||||
<td>
|
||||
<form id="<?php echo esc_attr($formId); ?>" method="post" action="">
|
||||
<?php wp_nonce_field('kb_markdown_update_product_' . $term->term_id); ?>
|
||||
<input type="hidden" name="kb_markdown_product_action" value="update">
|
||||
<input type="hidden" name="term_id" value="<?php echo esc_attr((string) $term->term_id); ?>">
|
||||
<?php submit_button(__('Save', 'kb-markdown-importer'), 'secondary small', 'submit', false); ?>
|
||||
</form>
|
||||
<form method="post" action="" style="margin-top:8px;" onsubmit="return window.confirm('<?php echo esc_js(__('Move this product and its imported pages to the trash?', 'kb-markdown-importer')); ?>');">
|
||||
<?php wp_nonce_field('kb_markdown_delete_product_' . $term->term_id); ?>
|
||||
<input type="hidden" name="kb_markdown_product_action" value="delete">
|
||||
<input type="hidden" name="term_id" value="<?php echo esc_attr((string) $term->term_id); ?>">
|
||||
<label>
|
||||
<input type="checkbox" name="trash_pages" value="1" checked>
|
||||
<?php esc_html_e('Trash imported pages', 'kb-markdown-importer'); ?>
|
||||
</label>
|
||||
<?php submit_button(__('Delete product', 'kb-markdown-importer'), 'delete small', 'submit', false); ?>
|
||||
</form>
|
||||
</td>
|
||||
<th><?php esc_html_e('Imported product', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Frontend product', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Documentation part', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Category', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Versions', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Pages', 'kb-markdown-importer'); ?></th>
|
||||
<th><?php esc_html_e('Delete', 'kb-markdown-importer'); ?></th>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (! $products) : ?>
|
||||
<tr><td colspan="7"><?php esc_html_e('No products have been imported yet.', 'kb-markdown-importer'); ?></td></tr>
|
||||
<?php endif; ?>
|
||||
<?php foreach ($products as $item) : ?>
|
||||
<?php
|
||||
$term = $item['term'];
|
||||
$meta = (array) $item['meta'];
|
||||
$versions = array_map(static fn (\WP_Term $version): string => $version->name, (array) $item['versions']);
|
||||
?>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="hidden" name="products[<?php echo esc_attr((string) $term->term_id); ?>][term_id]" value="<?php echo esc_attr((string) $term->term_id); ?>">
|
||||
<strong><?php echo esc_html($term->name); ?></strong>
|
||||
<br>
|
||||
<code><?php echo esc_html($term->slug); ?></code>
|
||||
<input type="hidden" name="products[<?php echo esc_attr((string) $term->term_id); ?>][product_name]" value="<?php echo esc_attr($term->name); ?>">
|
||||
<input type="hidden" name="products[<?php echo esc_attr((string) $term->term_id); ?>][product_slug]" value="<?php echo esc_attr($term->slug); ?>">
|
||||
</td>
|
||||
<td>
|
||||
<label class="screen-reader-text" for="group_name_<?php echo esc_attr((string) $term->term_id); ?>"><?php esc_html_e('Frontend product name', 'kb-markdown-importer'); ?></label>
|
||||
<input id="group_name_<?php echo esc_attr((string) $term->term_id); ?>" class="regular-text" type="text" name="products[<?php echo esc_attr((string) $term->term_id); ?>][group_name]" value="<?php echo esc_attr((string) $meta['group_name']); ?>" placeholder="<?php echo esc_attr($term->name); ?>">
|
||||
<br>
|
||||
<label class="screen-reader-text" for="group_slug_<?php echo esc_attr((string) $term->term_id); ?>"><?php esc_html_e('Frontend product slug', 'kb-markdown-importer'); ?></label>
|
||||
<input id="group_slug_<?php echo esc_attr((string) $term->term_id); ?>" class="regular-text" type="text" name="products[<?php echo esc_attr((string) $term->term_id); ?>][group_slug]" value="<?php echo esc_attr((string) $meta['group_slug']); ?>" placeholder="<?php echo esc_attr($term->slug); ?>">
|
||||
</td>
|
||||
<td>
|
||||
<input class="regular-text" type="text" name="products[<?php echo esc_attr((string) $term->term_id); ?>][part_label]" value="<?php echo esc_attr((string) $meta['part_label']); ?>" placeholder="<?php esc_attr_e('App, Modul, Exporter', 'kb-markdown-importer'); ?>">
|
||||
</td>
|
||||
<td>
|
||||
<input class="regular-text" type="text" name="products[<?php echo esc_attr((string) $term->term_id); ?>][category]" value="<?php echo esc_attr((string) $meta['category']); ?>" placeholder="<?php esc_attr_e('CRM, Telefonie, Integration', 'kb-markdown-importer'); ?>">
|
||||
</td>
|
||||
<td><?php echo esc_html($versions ? implode(', ', $versions) : __('No versions', 'kb-markdown-importer')); ?></td>
|
||||
<td><?php echo esc_html((string) $item['page_count']); ?></td>
|
||||
<td>
|
||||
<label>
|
||||
<input type="checkbox" name="delete_terms[]" value="<?php echo esc_attr((string) $term->term_id); ?>">
|
||||
<?php esc_html_e('Trash pages and remove product', 'kb-markdown-importer'); ?>
|
||||
</label>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php submit_button(__('Save all products', 'kb-markdown-importer'), 'primary', 'kb_markdown_save_all_products', false); ?>
|
||||
<?php submit_button(__('Delete selected', 'kb-markdown-importer'), 'delete', 'kb_markdown_delete_selected_products', false, [
|
||||
'onclick' => "return window.confirm('" . esc_js(__('Move selected products and their imported pages to the trash?', 'kb-markdown-importer')) . "');",
|
||||
]); ?>
|
||||
</form>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
private static function handleActions(ProductRepository $repository): void
|
||||
{
|
||||
$action = sanitize_key(wp_unslash((string) ($_POST['kb_markdown_product_action'] ?? '')));
|
||||
$action = '';
|
||||
if (isset($_POST['kb_markdown_save_all_products'])) {
|
||||
$action = 'save_all';
|
||||
} elseif (isset($_POST['kb_markdown_delete_selected_products'])) {
|
||||
$action = 'delete_selected';
|
||||
} else {
|
||||
$action = sanitize_key(wp_unslash((string) ($_POST['kb_markdown_product_action'] ?? '')));
|
||||
}
|
||||
|
||||
if (! $action) {
|
||||
return;
|
||||
}
|
||||
|
||||
$termId = absint($_POST['term_id'] ?? 0);
|
||||
if ('save_all' === $action) {
|
||||
check_admin_referer('kb_markdown_save_all_products');
|
||||
$products = (array) ($_POST['products'] ?? []);
|
||||
$saved = 0;
|
||||
|
||||
if (! $termId) {
|
||||
add_settings_error('kb_markdown_products', 'missing_term', __('Missing product ID.', 'kb-markdown-importer'), 'error');
|
||||
foreach ($products as $rawTermId => $rawProduct) {
|
||||
$termId = absint($rawTermId);
|
||||
$rawProduct = (array) $rawProduct;
|
||||
|
||||
if (! $termId) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = $repository->update(
|
||||
$termId,
|
||||
sanitize_text_field(wp_unslash((string) ($rawProduct['product_name'] ?? ''))),
|
||||
sanitize_title(wp_unslash((string) ($rawProduct['product_slug'] ?? ''))),
|
||||
[
|
||||
'group_name' => sanitize_text_field(wp_unslash((string) ($rawProduct['group_name'] ?? ''))),
|
||||
'group_slug' => sanitize_title(wp_unslash((string) ($rawProduct['group_slug'] ?? ''))),
|
||||
'part_label' => sanitize_text_field(wp_unslash((string) ($rawProduct['part_label'] ?? ''))),
|
||||
'category' => sanitize_text_field(wp_unslash((string) ($rawProduct['category'] ?? ''))),
|
||||
]
|
||||
);
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
add_settings_error('kb_markdown_products', 'update_failed_' . $termId, $result->get_error_message(), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
$saved++;
|
||||
}
|
||||
|
||||
add_settings_error('kb_markdown_products', 'updated', sprintf(
|
||||
/* translators: %d: number of saved products. */
|
||||
__('Saved %d products.', 'kb-markdown-importer'),
|
||||
$saved
|
||||
), 'success');
|
||||
return;
|
||||
}
|
||||
|
||||
if ('update' === $action) {
|
||||
check_admin_referer('kb_markdown_update_product_' . $termId);
|
||||
$result = $repository->update(
|
||||
$termId,
|
||||
sanitize_text_field(wp_unslash((string) ($_POST['product_name'] ?? ''))),
|
||||
sanitize_title(wp_unslash((string) ($_POST['product_slug'] ?? '')))
|
||||
);
|
||||
if ('delete_selected' === $action) {
|
||||
check_admin_referer('kb_markdown_save_all_products');
|
||||
$termIds = array_map('absint', (array) ($_POST['delete_terms'] ?? []));
|
||||
$deleted = 0;
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
add_settings_error('kb_markdown_products', 'update_failed', $result->get_error_message(), 'error');
|
||||
return;
|
||||
foreach (array_filter($termIds) as $termId) {
|
||||
$result = $repository->deleteProduct($termId, true);
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
add_settings_error('kb_markdown_products', 'delete_failed_' . $termId, $result->get_error_message(), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
$deleted++;
|
||||
}
|
||||
|
||||
add_settings_error('kb_markdown_products', 'updated', __('Product saved.', 'kb-markdown-importer'), 'success');
|
||||
return;
|
||||
}
|
||||
|
||||
if ('delete' === $action) {
|
||||
check_admin_referer('kb_markdown_delete_product_' . $termId);
|
||||
$trashPages = ! empty($_POST['trash_pages']);
|
||||
$result = $repository->deleteProduct($termId, $trashPages);
|
||||
|
||||
if (is_wp_error($result)) {
|
||||
add_settings_error('kb_markdown_products', 'delete_failed', $result->get_error_message(), 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
add_settings_error('kb_markdown_products', 'deleted', __('Product deleted.', 'kb-markdown-importer'), 'success');
|
||||
add_settings_error('kb_markdown_products', 'deleted', sprintf(
|
||||
/* translators: %d: number of deleted products. */
|
||||
__('Deleted %d products.', 'kb-markdown-importer'),
|
||||
$deleted
|
||||
), 'success');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user