renderedAssets = []; } protected function queryPosts(AcfCardData $acfCardData): array { // stub for tests if (! class_exists('WP_Query')) { return []; } $args = [ 'fields' => 'ids', 'post_type' => $acfCardData->postTypes, 'post_status' => $acfCardData->postStatuses, 'posts_per_page' => $acfCardData->limit, 'order' => $acfCardData->order, 'orderby' => $acfCardData->orderBy, ]; if ($acfCardData->postIn) { $args['post__in'] = $acfCardData->postIn; } if ($acfCardData->postNotIn) { $args['post__not_in'] = $acfCardData->postNotIn; } if (in_array($acfCardData->orderBy, ['meta_value', 'meta_value_num',], true)) { $args['meta_key'] = $acfCardData->orderByMetaField; } $query = new WP_Query($args); // only ids, as the 'fields' argument is set return $query->get_posts(); } public function getMarkup(AcfCardData $acfCardData, int $pageId): string { $postIds = $this->queryPosts($acfCardData); $markup = sprintf('
', $acfCardData->getSource()); foreach ($postIds as $postId) { $shortcode = sprintf( "[%s view-id='%s' object-id='%s']", Plugin::SHORTCODE, $acfCardData->acfViewId, $postId ); $markup .= do_shortcode($shortcode); } $markup .= '
'; // only once per page $isEnqueuedAssetsOnPage = true; if (! key_exists($pageId, $this->renderedAssets)) { $this->renderedAssets[$pageId] = []; } if (! in_array($acfCardData->getSource(), $this->renderedAssets[$pageId])) { $this->renderedAssets[$pageId][] = $acfCardData->getSource(); $isEnqueuedAssetsOnPage = false; } if (! $isEnqueuedAssetsOnPage) { $cssCode = str_replace(["\t", "\n", "\r"], '', $acfCardData->cssCode); $cssCode = trim($cssCode); $jsCode = str_replace(["\t", "\n", "\r"], '', $acfCardData->jsCode); $jsCode = trim($jsCode); // no escaping, it's a CSS code, so e.g '.a > .b' shouldn't be escaped $markup .= $cssCode ? "" : ''; $markup .= $jsCode ? "" : ''; } return $markup; } }