| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- <?php
- namespace MailPoet\Newsletter\Editor;
- if (!defined('ABSPATH')) exit;
- use MailPoet\Util\pQuery\pQuery;
- use MailPoet\WooCommerce\Helper as WooCommerceHelper;
- use MailPoet\WP\Functions as WPFunctions;
- class PostContentManager {
- const WP_POST_CLASS = 'mailpoet_wp_post';
- public $maxExcerptLength = 60;
- /** @var WooCommerceHelper */
- private $woocommerceHelper;
- /** @var WPFunctions */
- private $wp;
- public function __construct(
- WooCommerceHelper $woocommerceHelper = null
- ) {
- $this->wp = new WPFunctions;
- $this->maxExcerptLength = $this->wp->applyFilters('mailpoet_newsletter_post_excerpt_length', $this->maxExcerptLength);
- $this->woocommerceHelper = $woocommerceHelper ?: new WooCommerceHelper();
- }
- public function getContent($post, $displayType) {
- if ($displayType === 'titleOnly') {
- return '';
- }
- if ($this->woocommerceHelper->isWooCommerceActive() && $this->wp->getPostType($post) === 'product') {
- $product = $this->woocommerceHelper->wcGetProduct($post->ID);
- if ($product) {
- return $this->getContentForProduct($product, $displayType);
- }
- }
- if ($displayType === 'excerpt') {
- if ($this->wp->hasExcerpt($post)) {
- return self::stripShortCodes($this->wp->getTheExcerpt($post));
- }
- return $this->generateExcerpt($this->wp->getTheContent(null, false, $post));
- }
- return self::stripShortCodes($this->wp->getTheContent(null, false, $post));
- }
- public function filterContent($content, $displayType, $withPostClass = true) {
- $content = self::convertEmbeddedContent($content);
- // convert h4 h5 h6 to h3
- $content = preg_replace('/<([\/])?h[456](.*?)>/', '<$1h3$2>', $content);
- // convert currency signs
- $content = str_replace(
- ['$', '€', '£', '¥'],
- ['$', '€', '£', '¥'],
- $content
- );
- // strip useless tags
- $tagsNotBeingStripped = [
- '<p>', '<em>', '<span>', '<b>', '<strong>', '<i>',
- '<a>', '<ul>', '<ol>', '<li>', '<br>', '<blockquote>',
- ];
- if ($displayType === 'full') {
- $tagsNotBeingStripped = array_merge($tagsNotBeingStripped, ['<figure>', '<img>', '<h1>', '<h2>', '<h3>']);
- }
- if (is_array($content)) {
- $content = implode(' ', $content);
- }
- $content = strip_tags($content, implode('', $tagsNotBeingStripped));
- if ($withPostClass) {
- $dOMParser = new pQuery();
- $DOM = $dOMParser->parseStr(WPFunctions::get()->wpautop($content));
- $paragraphs = $DOM->query('p');
- foreach ($paragraphs as $paragraph) {
- // We replace the class attribute to avoid conflicts in the newsletter editor
- $paragraph->removeAttr('class');
- $paragraph->addClass(self::WP_POST_CLASS);
- }
- $content = $DOM->__toString();
- } else {
- $content = WPFunctions::get()->wpautop($content);
- }
- $content = trim($content);
- return $content;
- }
- private function getContentForProduct($product, $displayType) {
- if ($displayType === 'excerpt') {
- return $product->get_short_description();
- }
- return $product->get_description();
- }
- private function generateExcerpt($content) {
- // remove image captions in gutenberg
- $content = preg_replace(
- "/<figcaption.*?>.*?<\/figcaption>/",
- '',
- $content
- );
- // remove image captions in classic posts
- $content = preg_replace(
- "/\[caption.*?\](.*?)\[\/caption\]/",
- '',
- $content
- );
- $content = self::stripShortCodes($content);
- // if excerpt is empty then try to find the "more" tag
- $excerpts = explode('<!--more-->', $content);
- if (count($excerpts) > 1) {
- // <!--more--> separator was present
- return $excerpts[0];
- } else {
- // Separator not present, try to shorten long posts
- return WPFunctions::get()->wpTrimWords($content, $this->maxExcerptLength, ' …');
- }
- }
- private function stripShortCodes($content) {
- // remove captions
- $content = preg_replace(
- "/\[caption.*?\](.*<\/a>)(.*?)\[\/caption\]/",
- '$1',
- $content
- );
- // remove other shortcodes
- $content = preg_replace('/\[[^\[\]]*\]/', '', $content);
- return $content;
- }
- private function convertEmbeddedContent($content = '') {
- // remove embedded video and replace with links
- $content = preg_replace(
- '#<iframe.*?src=\"(.+?)\".*><\/iframe>#',
- '<a href="$1">' . __('Click here to view media.', 'mailpoet') . '</a>',
- $content
- );
- // replace youtube links
- $content = preg_replace(
- '#http://www.youtube.com/embed/([a-zA-Z0-9_-]*)#Ui',
- 'http://www.youtube.com/watch?v=$1',
- $content
- );
- return $content;
- }
- }
|