Skip to content
Snippets Groups Projects
Mailing-Hooks.php 2.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * CiviCRM Mailing_Hooks class.
     *
     * @since 0.1
     */
    
    namespace CiviCRM_WP_REST\Civi;
    
    class Mailing_Hooks {
    
    	/**
    	 * Mailing Url endpoint.
    	 *
    	 * @since 0.1
    	 * @var string
    	 */
    	public $url_endpoint;
    
    	/**
    	 * Mailing Open endpoint.
    	 *
    	 * @since 0.1
    	 * @var string
    	 */
    	public $open_endpoint;
    
    	/**
    	 * Constructor.
    	 *
    	 * @since 0.1
    	 */
    	public function __construct() {
    
    		$this->url_endpoint = rest_url( 'civicrm/v3/url' );
    
    		$this->open_endpoint = rest_url( 'civicrm/v3/open' );
    
    	}
    
    	/**
    	 * Register hooks.
    	 *
    	 * @since 0.1
    	 */
    	public function register_hooks() {
    
    		add_filter( 'civicrm_alterMailParams', [ $this, 'do_mailing_urls' ], 10, 2 );
    
    	}
    
    	/**
    	 * Filters the mailing html and replaces calls to 'extern/url.php' and
    	 * 'extern/open.php' with their REST counterparts 'civicrm/v3/url' and 'civicrm/v3/open'.
    	 *
    	 * @uses 'civicrm_alterMailParams'
    	 *
    	 * @since 0.1
    	 * @param array &$params Mail params
    	 * @param string $context The Context
    	 * @return array $params The filtered Mail params
    	 */
    	public function do_mailing_urls( &$params, $context ) {
    
    		if ( $context == 'civimail' ) {
    
    			$params['html'] = $this->replace_html_mailing_tracking_urls( $params['html'] );
    
    			$params['text'] = $this->replace_text_mailing_tracking_urls( $params['text'] );
    
    		}
    
    		return $params;
    
    	}
    
    	/**
    	 * Replace html mailing tracking urls.
    	 *
    	 * @since 0.1
    	 * @param string $contnet The mailing content
    	 * @return string $content The mailing content
    	 */
    	public function replace_html_mailing_tracking_urls( string $content ) {
    
    		$doc = \phpQuery::newDocument( $content );
    
    		foreach ( $doc[ '[href*="civicrm/extern/url.php"], [src*="civicrm/extern/open.php"]' ] as $element ) {
    
    			$href = pq( $element )->attr( 'href' );
    			$src = pq( $element )->attr( 'src' );
    
    			// replace extern/url
    			if ( strpos( $href, 'civicrm/extern/url.php' ) )	{
    
    				$query_string = strstr( $href, '?' );
    				pq( $element )->attr( 'href', $this->url_endpoint . $query_string );
    
    			}
    
    			// replace extern/open
    			if ( strpos( $src, 'civicrm/extern/open.php' ) ) {
    
    				$query_string = strstr( $src, '?' );
    				pq( $element )->attr( 'src', $this->open_endpoint . $query_string );
    
    			}
    
    			unset( $href, $src, $query_string );
    
    		}
    
    		return $doc->html();
    
    	}
    
    	/**
    	 * Replace text mailing tracking urls.
    	 *
    	 * @since 0.1
    	 * @param string $contnet The mailing content
    	 * @return string $content The mailing content
    	 */
    	public function replace_text_mailing_tracking_urls( string $content ) {
    
    		// replace extern url
    		$content = preg_replace( '/http.*civicrm\/extern\/url\.php/i', $this->url_endpoint, $content );
    
    		// replace open url
    		$content = preg_replace( '/http.*civicrm\/extern\/open\.php/i', $this->open_endpoint, $content );
    
    		return $content;
    
    	}
    
    }