Задать вопрос

Как объединить две функции в одном плагине Wordpress?

Хочу при помощи вебхуков вставить в тело письма Contact Form 7 фото товара, со страницы которого данная форма отправляется.
Нашел очень хороший плагин, который добавляет это самое фото во вложение к письму:
// Add product image to email as an attachment
add_filter( 'wpcf7_mail_components', 'dcwd_cf7_mail_components', 10, 3 );
function dcwd_cf7_mail_components( $components, $current_cf7_form, $form_object ) {
	$cf7_form_id = 10454;
  
	// Verify that the we are processing the correct form.
	if ( $cf7_form_id == $current_cf7_form->id() ) {
		// Ensure that a match was found.
		if ( 1 === preg_match( '/Product ID: (\d+)/m', $components[ 'body' ], $matches ) ) {
			$product_id = $matches[1];
			
			// Check that the matched product ID is a number.
			if ( ( $product_id > 0 ) && is_numeric( $product_id ) ) {
				// Create a product object...
				$product = wc_get_product( $product_id );
				// checking that the ID is a valid product...
				if ( is_object( $product ) ) {
					// then get the product image url.
					$product_image_url = wp_get_attachment_image_src( $product->get_image_id(), 'large' )[ 0 ];
					if ( $product_image_url ) {
						// Change the url to an absolute path to include it in the email.
						$product_image_path = str_replace( WP_CONTENT_URL, WP_CONTENT_DIR, $product_image_url );
						
						// Verify that the file exists before appending it to the attachments array.
						if ( file_exists( $product_image_path ) ) {
							$components[ 'attachments' ][] = $product_image_path;
						}
					}
				}
			}
		}
	}

	return $components;
}


Есть также вот такой код от другого автора для добавления ссылки на фото в само письмо:
<?php
add_filter( 'wpcf7_before_send_mail', 'wpcf7_before_send_mail_start_function' );
 
function wpcf7_before_send_mail_start_function($cf7){
  //Get the form ID
    $form_id = $contact_form->id();

    //Do something specifically for form with the ID "123"
    if( $form_id == 10454 ) {
    $mail = $cf7->prop('mail');
    if($mail){
    $postr = $_POST['_wpcf7_container_post'];//получаем id поста с которого отправлена форма
    $imgges_url = get_the_post_thumbnail_url($postr,'full');//получаем ссылку на картинку 
    //$imgges = get_the_post_thumbnail($postr,'thumbnail');//получаем саму картинку с тегом img
    $mail['body'].='Фото товара'."$imgges_url";// допишем в конец письма ссылку
    $cf7->set_properties(array('mail'=>$mail));// 
    }
   }
 }


Но данный вариант не совсем то, что мне нужно.

Я пытался объединить два этих кода, чтобы абсолютная ссылка на фото из первого кода отправлялась через before send mail из второго пункта, но скорее всего проблема в том, что я неправильно вызываю функции при объединении этих строк кода.
Вот что я пытался сделать, добавил комментарии и перевел некоторые комментарии автора первого кода (*** - неточный перевод):

<?php

// Добавил к фильтрам из первого кода фильтры из второго
add_filter( 'wpcf7_mail_components', 'dcwd_cf7_mail_components', 'wpcf7_before_send_mail', 'wpcf7_before_send_mail_start_function' );

// Думаю в данном случае мне нужна функция из второго кода, поэтому вызвал её, но на всякий случай добавил элементы из первого ($current_cf7_form, $form_object)
function wpcf7_before_send_mail_start_function($cf7, $current_cf7_form, $form_object){
	$cf7_form_id = 10454;
  
	// Проверяем что мы работаем с нужной формой
	if ( $cf7_form_id == $current_cf7_form->id() ) {
		// Находим ID товара из тела письма (добавлен посредством плагина Dynamic Text Extension)
		if ( 1 === preg_match( '/Product ID: (\d+)/m', $components[ 'body' ], $matches ) ) {
			$product_id = $matches[1];
			
			// Убеждаемся в  том, что найденный ID товара это число.
			if ( ( $product_id > 0 ) && is_numeric( $product_id ) ) {
				// Создаем объект товара ***
				$product = wc_get_product( $product_id );
				// Проверяем, что товар это нужный объект ***
				if ( is_object( $product ) ) {
					// получаем URL изображения товара 
					$product_image_url = wp_get_attachment_image_src( $product->get_image_id(), 'large' )[ 0 ];
					if ( $product_image_url ) {
						// Меняем URL на абсолютный путь к фото для добавления в письмо
						$product_image_path = str_replace( WP_CONTENT_URL, WP_CONTENT_DIR, $product_image_url );
						
						// Убеждаемся в наличии фото и добавляем в тело письма вместо вложений
						if ( file_exists( $product_image_path ) ) {
							$mail['body'].='Фото товара'."$product_image_path";// допишем в конец письма ссылку
    $cf7->set_properties(array('mail'=>$mail));// 
						}
					}
				}
			}
		}
	}
}


Что мне нужно исправить в этом коде, чтоб из абсолютная ссылка из первого кода с тегом img вставлялась в тело письма?
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы