Вопрос или проблема
Если, например, я фильтрую свой пользовательский тип записи по дате, и на экране отображаются только 2 записи, я хочу экспортировать только эти 2 записи, но происходит экспорт множества записей, которые мне не под контролю, то есть неправильных записей.
Как я могу изменить это, чтобы экспортировать только то, что отображается на экране, то есть эти 2 записи в данном случае?
add_action( 'init', 'func_export_some_records' );
function func_export_all_posts() {
if(isset($_GET['export_some_records'])) {
$arg = array(
'post_type' => 'shirts',
'fields' => 'ids'
);
global $post;
$arr_post = get_posts($arg);
if ($arr_post) {
header("Content-Description: File Transfer");
header("Content-Type: application/csv");
header('Content-Disposition: attachment; filename="wp.csv"');
header('Pragma: no-cache');
header('Expires: 0');
$file = fopen('php://output', 'w');
fputcsv($file, array('COLUMN ONE', 'COLUMN TWO'));
foreach ($arr_post as $post) {
$color = get_post_meta( $post, 'user-color', true );
$size = get_post_meta( $post, 'user-size', true );
fputcsv($file, array($color, $size));
}
fclose($file);
}
}
}
Вот кнопка, которая вызывает загрузку:
add_action( 'manage_posts_extra_tablenav', 'admin_post_list_top_export_button', 20, 1 );
function admin_post_list_top_export_button( $which ) {
global $typenow;
if ( 'shirts' === $typenow && 'top' === $which ) {
?>
<input type="submit" name="export_some_records" id="export_some_records" class="button button-primary" value="Экспортировать некоторые записи" />
<?php
}
}
Один из способов, о котором я думал, но не совсем уверен, как его реализовать, это получить все ID записей, которые в данный момент отображаются на экране, а затем в моем массиве $arg использовать 'includes' => 'id записи здесь'
<?php
//edit.php?s&post_status=all&post_type=shirts&action=-1&m=0&slug=03-02-2020&filter_action=Filter&paged=1&action2=-1
//$parse_uri = explode('wp-content', $_SERVER['SCRIPT_FILENAME']);
//require_once($parse_uri[0] . 'wp-load.php');
header("Content-Description: File Transfer");
header("Content-Type: application/csv");
header('Content-Disposition: attachment; filename="wp.csv"');
header('Pragma: no-cache');
header('Expires: 0');
global $post;
//https://developer.wordpress.org/reference/classes/wp_query/
$post_status = isset($_REQUEST['post_status']) && $_REQUEST['post_status']=='all' ? 'any' : 'publish';
$date = explode('-',$_REQUEST['slug']);
$posts_per_page = $_REQUEST['action2'];
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$arg = array(
'post_type' => $_REQUEST['post_type'],
'post_status' => $post_status,
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'date_query' => array(
'column' => 'post_date',
'year' => $date[2],
'month' => $date[1],
'day' => $date[0],
)
);
$posts = new WP_Query($arg);
if($posts->have_posts()){
$file = fopen('php://output', 'w');
fputcsv($file, array('COLUMN ONE', 'COLUMN TWO'));
while ( $posts->have_posts() ){
$posts->the_post();
$color = get_post_meta( $post->ID, 'user-color', true );
$size = get_post_meta( $post->ID, 'user-size', true );
fputcsv($file, array($color, $size));
}
fclose($file);
}
?>
Создайте файл (csv.php) в корне вашего шаблона и для теста измените ID.
Затем выполните код, получив доступ по URL:
//www.your_domain/wp-content/themes/your_template/csv.php
<?php
header("Content-Description: File Transfer");
header("Content-Type: application/csv");
header('Content-Disposition: attachment; filename="wp.csv"');
header('Pragma: no-cache');
header('Expires: 0');
$parse_uri = explode('wp-content', $_SERVER['SCRIPT_FILENAME']);
require_once($parse_uri[0] . 'wp-load.php');
$color="";
$size="";
$post_ids = array('68251','68159');
$args = array(
'post_type' => 'shirts',
'nopaging' => true,
'post_status' => 'any',
'include' => $post_ids,
);
$posts = get_posts($args);
if($posts){
$file = fopen('php://output', 'w');
fputcsv($file,array('COLUMN ONE','COLUMN TWO'));
foreach ($posts as $post){
$color = get_post_meta( $post->ID, 'user-color', true );
$size = get_post_meta( $post->ID, 'user-size', true );
fputcsv($file,array($color,$size));
}
fclose($file);
}
?>
Ответ или решение
Чтобы экспортировать только те записи, которые отображаются на экране в административной панели вашего пользовательского типа записи (в данном случае, "shirts"), вам необходимо модифицировать ваш текущий код, чтобы он использовал параметры фильтрации и пагинации, заданные в запросе.
Шаг 1: Определение видимых записей
Для начала, вам нужно получить идентификаторы записей, которые отображаются на текущей странице админки. Это можно сделать, создав новый WP_Query на основе параметров, переданных через GET-запрос.
Шаг 2: Изменение функции экспорта
Измените вашу функцию func_export_some_records
, чтобы она извлекала только те посты, которые видны на текущей странице. Пример исправленного кода:
add_action( 'init', 'func_export_some_records' );
function func_export_some_records() {
if ( isset( $_GET['export_some_records'] ) ) {
$post_status = isset( $_REQUEST['post_status'] ) && $_REQUEST['post_status'] == 'all' ? 'any' : 'publish';
$paged = isset( $_REQUEST['paged'] ) ? (int) $_REQUEST['paged'] : 1;
$posts_per_page = 20; // Или любое другое значение, которое вы используете
$arg = array(
'post_type' => 'shirts',
'post_status' => $post_status,
'posts_per_page' => $posts_per_page,
'paged' => $paged,
// Добавьте дополнительные аргументы фильтрации, если необходимо
);
$posts = new WP_Query( $arg );
if ( $posts->have_posts() ) {
header("Content-Description: File Transfer");
header("Content-Type: application/csv");
header('Content-Disposition: attachment; filename="wp.csv"');
header('Pragma: no-cache');
header('Expires: 0');
$file = fopen('php://output', 'w');
fputcsv($file, array('COLUMN ONE', 'COLUMN TWO'));
while ( $posts->have_posts() ) {
$posts->the_post();
$color = get_post_meta( get_the_ID(), 'user-color', true );
$size = get_post_meta( get_the_ID(), 'user-size', true );
fputcsv($file, array($color, $size));
}
fclose($file);
exit; // Завершите выполнение скрипта
}
}
}
Шаг 3: Кнопка для экспорта
Ваш код для создания кнопки экспорта выглядит корректно, однако убедитесь, что он добавляет кнопку только для нужного типа записи:
add_action( 'manage_posts_extra_tablenav', 'admin_post_list_top_export_button', 20, 1 );
function admin_post_list_top_export_button( $which ) {
global $typenow;
if ( 'shirts' === $typenow && 'top' === $which ) {
echo '<input type="submit" name="export_some_records" id="export_some_records" class="button button-primary" value="Export Some Records" />';
}
}
Заключение
При реализации вышеприведённых изменений, ваш функционал экспорта будет соответствовать требованиям, и вы сможете успешно экспортировать только те записи, которые видны на экране в админ-панели. Настройка WP_Query с соответствующими параметрами фильтрации и пагинации обеспечит правильный выбор постов для экспорта.
Также, важно помнить об обработке ошибок и проверка прав доступа, если это необходимо в вашем проекте.