DrZhmurge
@DrZhmurge

Как добавить поле поиска записи или таксономии в админке Wordpress или Woocommerce?

Есть Woo код который позволяет добавить в админку поле с поиском товаров (по аналогии с кросселами, апселами):
<select
		id="product_field_type"
		name="product_field_type[]"
		class="wc-product-search"
		multiple="multiple"
		style="width: 50%;"
		data-placeholder="<?php esc_attr_e( 'Search for a product…', 'woocommerce' ); ?>"
		data-action="woocommerce_json_search_products_and_variations"
		data-exclude="<?php echo intval( $post->ID ); ?>">
		<?php
		$product_ids            = [];
		$product_field_type_ids = get_post_meta( $post->ID, '_product_field_type_ids', true );

		if ( ! empty( $product_field_type_ids ) ) {
			$product_ids = array_map( 'absint', $product_field_type_ids );
		}

		if ( $product_ids ) {
			foreach ( $product_ids as $product_id ) {
				$product = wc_get_product( $product_id );

				echo sprintf(
					'<option value="%s" %s>%s</option>',
					esc_attr( $product_id ),
					selected( true, true, false ),
					esc_html( $product->get_formatted_name() )
				);
			}
		}
		?>
	</select>


Можно ли его приспособить для вывода других данных (кастомных записей или таксономий)?
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
DrZhmurge
@DrZhmurge Автор вопроса
переопределяем функцию которую дата указана в "data-action", на любую кастомную.
У меня: data-action="search_posts".
Далее создаем функцию search_posts:

add_action('wp_ajax_search_posts', 'search_posts');
function search_posts()
{
	$s = $_GET['term']; //получает данные введенного текста для поиска
	$args = array(
		'post_type' => 'collection',  //ваш тип поста
		's' => $s, //поисковый запрос
	);
	$data = [];
	$loop = new WP_Query($args);
	if ($loop->have_posts()) {
		while ($loop->have_posts()) {
			$loop->the_post();
			$post_id = get_the_id(); //получаем id записи
			$post_name = get_the_title(); //получаем title записи
			$data[$post_id] = $post_name; // добавляем в массив data
		}
	}
	echo json_encode($data); //кодируем в json и выводим
	wp_die(); //иначе 0 в конце всегда лишний в выводе
}


Далее меняем вывод нужных нам данных уже в самом поле select. Приведу в пример полный код select, чтобы не запутаться:
<select id="product_field_type" name="product_field_type[]" class="wc-product-search" multiple="multiple" style="width: 50%;" data-placeholder="<?php esc_attr_e('Поиск по названию коллекции', 'woocommerce'); ?>" data-action="search_posts">
					<?php
					$product_ids            = [];
					$product_field_type_ids = get_post_meta(get_the_ID(), '_product_field_type_ids', true);  //сменил $post->ID на get_the_ID()
					
					if (!empty($product_field_type_ids)) {
						$product_ids = array_map('absint', $product_field_type_ids);
					}

					if ($product_ids) {
						foreach ($product_ids as $product_id) {
							//$product = new WP_Query($product_id);  больше не нужен
							
							echo sprintf(
								'<option value="%s" %s>%s</option>',
								esc_attr($product_id),
								selected(true, true, false),
								esc_html(get_the_title($product_id)) //получаем нужный нам title по id записи
							);
						}
					}
					?>
				</select>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы