رفتن به مطلب

قلاب کردن یه کلاس از یک پلاگین دیگر


پست های پیشنهاد شده

سلام کسی راه حل اصولی و منطقی و تمیزی برای اینکلود کردن یه کلاس از یه پلاگین دیگه داره من میخوام از یکی از متغییرهاش که به صورت ابجکت هست استفاده کنم . راه حلی که پیشنهاد میدین ایا برای کال کردن و استفاده از خروجی یه فانکشن که اون هم باز از یه پلاگین دیگه ست جواب میده آیا ؟ فانکشن مورد نظر توی پوشه ی functions.php قرار داره .

لینک به ارسال

سوالتون خیلی کلی هست، باید سورس رو دید تا بهترین روش رو گفت ولی این کلا ارتباطی به وردپرس نداره، مربوط به مفاهیم OOP هست. باید اول ببینید اون کلاس وجود داره یا خیر که کلا روی هوک

plugins_loaded

استفاده میکنیم، بقیه اش هم که به php مربوطه، بنظرم این لینک کمکتون میکنه:

https://www.w3schools.com/php/php_oop_inheritance.asp

لینک به ارسال

سلام من با مفاهیم شی گرایی php کاملا اشنایی دارم فکر کنم مفهوم رو اشتباه رسوندم من یه پلاگین دارم برای یه مشتری و کار ساده ای که باید انجام بده اینه که یه ایمیل ارسال کنه و همراهش pdf invoice هستش که از یه پلاگین دیگه هستش به اسم woocommrce pdf invoice and packing slip من فانکشنی که این فایل رو ایجاد میکنه میدونم کجاست توی پلاگین و فقط خروجی اون فانکشن که فایل مورد نظرم هست رو میخوام برای این کار باید اول فایل functions.php رو کال کنم توی پلاگینم و بعدش از فانکشن های توی فایل استفاده کنم . ولی نمیدونم چجوری اصولی با هوک میشه این کار رو کرد یه کلاس هم هست از داخل اون پلاگین که order رو توی یه متغییر به صورت ابجکت داره که باید اون رو هم کال کنم تا بتونم متغییر رو داشته باشم لازم به ذکر که محافظت شده نیست . کلاس به صورت ابسترکت هستش .

https://justpaste.me/51Sv

توی این کد بالا میخوام قرارش بدم . کلاس زیر کلاس مد نظر هستش  :

https://pastebin.pl/view/6997c895

 

لینک به ارسال

من یه نگاه کلی انداختم، اصلا فکر نمیکنم نیازی به include داشته باشید. این افزونه یه هوک داره که با همون میتونید کاری که میخواید رو بکنید بنظرم:

add_action( 'wpo_wcpdf_pdf_created', 'ywp_custom_func', 10, 2 );
function ywp_custom_func( $pdf, $class ) {
	// $pdf => reffered to pdf object
	// $class => reffered to Order_Document class
	// $class->order_id => referred to current order id
	// Your code comes here
}

فکر میکنم همین کارتون رو راه بندازه، البته تست نکردم و چون دیر وقته یه مقدار هم خسته هستم، تست کنید اگه موردی بود میشه روش وقت گذاشت سر فرصت

لینک به ارسال
در 10 ساعت قبل، yazdaniwp گفته است :

من یه نگاه کلی انداختم، اصلا فکر نمیکنم نیازی به include داشته باشید. این افزونه یه هوک داره که با همون میتونید کاری که میخواید رو بکنید بنظرم:


add_action( 'wpo_wcpdf_pdf_created', 'ywp_custom_func', 10, 2 );
function ywp_custom_func( $pdf, $class ) {
	// $pdf => reffered to pdf object
	// $class => reffered to Order_Document class
	// $class->order_id => referred to current order id
	// Your code comes here
}

فکر میکنم همین کارتون رو راه بندازه، البته تست نکردم و چون دیر وقته یه مقدار هم خسته هستم، تست کنید اگه موردی بود میشه روش وقت گذاشت سر فرصت

سلام ممنون اقای یزدانی من هوک رو تست کردم ولی جوابی نگرفتم . میتونین خودتون هم تست کنین ببینین مشکل از سمت من هستش یا کد ؟

لینک به ارسال

کدتون رو لطفا قرار بدید تا بتونیم تست کنیم

فقط کد اگر خطوطش زیاد هست بصورت فایل یا فایل نوت ارسال بشه.

لینک به ارسال
در در ۱۳۹۹/۵/۲۰ در 13:35، keeper.01 گفته است :

سلام ممنون اقای یزدانی من هوک رو تست کردم ولی جوابی نگرفتم . میتونین خودتون هم تست کنین ببینین مشکل از سمت من هستش یا کد ؟

خواهش میکنم. همونطور که جناب گرانسایه که فرمودن کدی که زدید رو قرار بدید. اما برای تست خودتون یکبار وردی های فانکشن رو تست بگیرید.

var_dump( $pdf );

این کلاسی که گذاشتید هوکهای دیگه هم داشت ولی بنظرم همین هوک جوابگو هست ولی بقیه رو هم تست بفرمایید. اگه به نتیجه نرسید کدتون رو بفرستید تا اساتید بررسی کنن. سلامت و موفق باشید.

لینک به ارسال
در 19 ساعت قبل، yazdaniwp گفته است :

خواهش میکنم. همونطور که جناب گرانسایه که فرمودن کدی که زدید رو قرار بدید. اما برای تست خودتون یکبار وردی های فانکشن رو تست بگیرید.


var_dump( $pdf );

این کلاسی که گذاشتید هوکهای دیگه هم داشت ولی بنظرم همین هوک جوابگو هست ولی بقیه رو هم تست بفرمایید. اگه به نتیجه نرسید کدتون رو بفرستید تا اساتید بررسی کنن. سلامت و موفق باشید.

سلام ممنون از جوابگوییتون من کد رو این جور نوشتم :

<?php
/**
 * @package     Mail_Plugin
 */

namespace Inc\Api\data;

//use Inc\base\mailconfig;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

require_once ( plugin_basename ( dirname ( __FILE__, 2) . 'vendor/autoload.php' ) );

class ProductCategory
{
//    public $sending;

    public function __construct()
    {
        // Hook to woocommerce pdf invoice and packing slip plugin to utilize order_id and pdf document that created by it .
        add_action ( 'wpo_wcpdf_pdf_created', 'productCategory', 10, 2 );
    }

    public function register ()
    {
//        $this->sending = new MailConfig();
    }

    public function productCategory ( $pdf, $class )
    {
        $order = wc_get_order ( $class->order_id );
        $order_id = $order->get_id ();

        // iterate into the order items and fetch the product name and id .
        foreach ( $order->get_items as $item_id => $item)
        {
            $product_id = $item->get_product_id ();
            $name = $item->get_name ();
        }

        // Fetch the product categories by product id .
        $product = wc_get_product ( $product_id );
        $product_category = $product->get_categories ();

        switch ( $product_category )
        {
            case 'Natural Dyes':
                // if an order is made by a customer and it's consists a product from Natural Dyes shipped to " naturaldyedropshipper@wholesaleroots.com " Email.
                $file = $pdf ;

                $mail = new PHPMailer(true);
                try {
                    // Set information of mail server
                    $mail->SMTPDebug = 2;
                    $mail->isSMTP();
                    $mail->Host = 'smtp.gmail.com' ; // get_option ( 'mail_server', $default = false ) ;
                    $mail->SMTPAuth = true;
                    $mail->Username = 'mr.mohseni76@gmail.com' ; // get_option ( 'mail_username', $default = false ) ;
                    $mail->Password = '' ; // get_option ( 'mail_password', $default = false ) ;
                    $mail->SMTPSecure = 'tls';
                    $mail->Port = 587 ; // get_option ( 'mail_port', $default = false ) ;

                    // Recipients
                    $mail->setFrom( 'mr.mohseni76@gmail.com', 'wholesaleroots.com');
                    $mail->addReplyTo( 'mr.mohseni76@gmail.com', 'wholesaleroots.com');
                    $mail->addAddress( 'sir.mohseni20@gmail.com', 'mohseni');

                    // Contents
                    $mail->isHTML(true);
                    $mail->Subject = 'Customer Invoice';
                    $mail->Body = '#';
                    $mail->addAttachment( $file );

                    // Send Email
                    $mail->send();
                }
                catch (Exception $e)
                {
                    echo '<p>Message could not be sent . Error : </p>', $mail->ErrorInfo;
                }

//                $this->sending->set_data( $file, 'sir.mohseni20@gmail.com');
                break;

                case 'Medicinal Barks':
                // if an order is made by a customer and it's consists a product from Medicinal Barks shipped to " medicinalbarks@wholesaleroots.com " Email.
                $file = $pdf ; // wcpdf_get_invoice ( $order, $init = false );
                $mail = new PHPMailer(true);
                try {
                    // Set information of mail server
                    $mail->SMTPDebug = 2;
                    $mail->isSMTP();
                    $mail->Host = 'smtp.gmail.com' ; // get_option ( 'mail_server', $default = false ) ;
                    $mail->SMTPAuth = true;
                    $mail->Username = 'mr.mohseni76@gmail.com' ; // get_option ( 'mail_username', $default = false ) ;
                    $mail->Password = '' ; // get_option ( 'mail_password', $default = false ) ;
                    $mail->SMTPSecure = 'tls';
                    $mail->Port = 587 ; // get_option ( 'mail_port', $default = false ) ;

                    // Recipients
                    $mail->setFrom( 'mr.mohseni76@gmail.com', 'wholesaleroots.com');
                    $mail->addReplyTo( 'mr.mohseni76@gmail.com', 'wholesaleroots.com');
                    $mail->addAddress( 'sir.mohseni20@gmail.com', 'mohseni');

                    // Contents
                    $mail->isHTML(true);
                    $mail->Subject = 'Customer Invoice';
                    $mail->Body = '#';
                    $mail->addAttachment( $file );

                    // Send Email
                    $mail->send();
                }
                catch (Exception $e)
                {
                    echo '<p>Message could not be sent . Error : </p>', $mail->ErrorInfo;
                }

//                $this->sending->set_data( $file, 'sir.mohseni20@gmail.com');
                break;

                case 'Natural Teas':
                // if an order is made by a customer and it's consists a product from Natural Teas shipped to " naturalteas@wholesaleroots.com " Email.
                $file = $pdf ; // wcpdf_get_invoice ( $order, $init = false );
                $mail = new PHPMailer(true);
                try {
                    // Set information of mail server
                    $mail->SMTPDebug = 2;
                    $mail->isSMTP();
                    $mail->Host = 'smtp.gmail.com' ; // get_option ( 'mail_server', $default = false ) ;
                    $mail->SMTPAuth = true;
                    $mail->Username = 'mr.mohseni76@gmail.com' ; // get_option ( 'mail_username', $default = false ) ;
                    $mail->Password = '' ; // get_option ( 'mail_password', $default = false ) ;
                    $mail->SMTPSecure = 'tls';
                    $mail->Port = 587 ; // get_option ( 'mail_port', $default = false ) ;

                    // Recipients
                    $mail->setFrom( 'mr.mohseni76@gmail.com', 'wholesaleroots.com');
                    $mail->addReplyTo( 'mr.mohseni76@gmail.com', 'wholesaleroots.com');
                    $mail->addAddress( 'sir.mohseni20@gmail.com', 'mohseni');

                    // Contents
                    $mail->isHTML(true);
                    $mail->Subject = 'Customer Invoice';
                    $mail->Body = '#';
                    $mail->addAttachment( $file );

                    // Send Email
                    $mail->send();
                }
                catch (Exception $e)
                {
                    echo '<p>Message could not be sent . Error : </p>', $mail->ErrorInfo;
                }

//                $this->sending->set_data( $file, 'sir.mohseni20@gmail.com');
                break;
        }
    }
}

 

لینک به ارسال

سلام.خواهش میکنم. کدتون واقعا ایرادات جدی داره:

در 6 ساعت قبل، keeper.01 گفته است :

use PHPMailer\PHPMailer\PHPMailer;

چرا از wp_mail استفاده نمیکنید؟

مستندات: https://developer.wordpress.org/reference/functions/wp_mail/

 

در 6 ساعت قبل، keeper.01 گفته است :

add_action ( 'wpo_wcpdf_pdf_created', 'productCategory', 10, 2 );

وقتی دارید یک فانکشن از یک کلاس رو صدا میزنید، طبق قواعد OOP باید آرایه پاس بدید نه اسم فانکشن. در واقع به این شکل باید انجام بدید:

add_action ( 'wpo_wcpdf_pdf_created', array( $this, 'productCategory' ), 10, 2 );

که کلمه کلیدی $this به کلاس جاری اشاره میکنه.

 

در 6 ساعت قبل، keeper.01 گفته است :

$order = wc_get_order ( $class->order_id );

شما در خط بالا شماره سفارش رو دارید. چه لزومی داره که ازش یک آبجکت ساختید و بعد در خط بعدی از همون آبجکت مجددا شماره سفارش رو دریافت کردید؟

 

در 6 ساعت قبل، keeper.01 گفته است :

// iterate into the order items and fetch the product name and id . foreach ( $order->get_items as $item_id => $item) { $product_id = $item->get_product_id (); $name = $item->get_name (); } // Fetch the product categories by product id . $product = wc_get_product ( $product_id ); $product_category = $product->get_categories ();

با حلقه بالا که شما نوشتید فقط محصول آخری که در سفارش هست چک میشه چون شما با حلقه، همه آیتمها رو بررسی کردید و ریختید داخل دو متغیر و با هر بار اجرا، این متغیرها بروز میشن و فقط آیتم آخر میمونه!

 

در 6 ساعت قبل، keeper.01 گفته است :

$product_category = $product->get_categories ();

خروجی این خط یک آرایه از همه دسته بندی هاست.

مستندات: https://developer.wordpress.org/reference/functions/get_categories/

ولی شما فرض رو گذاشتید بر متنی بودن نتیجه و switch زدید روی مقادیر! درست ترش اینه که از in_array استفاده کنید.

مستندات: https://www.php.net/manual/en/function.in-array.php

 

در کل کد شما خطا داره چون اصلا فانکشن رو نمیتونه داخل کلاس پیدا کنه.

بر فرض اینکه اجرا هم بشه، فقط محصول آخر بررسی میشه.

حتی این مرحله رو هم گذر کنیم ازش، شما دارید مقادیر رو رشته در نظر میگیرید که کلا آرایه هستن.

در ضمن این افزونه خودش بصورت پیشفرض ارسال ایمیل داره البته نه به تفکیک آیتمها ولی در کل کدتون هیچیش درست نیست.

 

اما هوک دقیقا همینه، بنده تست کردم و این هوک در زمان ایجاد فایل pdf با همون آبجکت class که گفتم قابل دسترسی هست. برای تست میتونید از کد زیر استفاده کنید:

error_log( print_r( $class, true ) );

با این خط، یک خطا در error_log وبسرور اضافه میشه که میتونید صحت کدتون رو بررسی کنید.

موفق باشید.

لینک به ارسال
در 9 ساعت قبل، yazdaniwp گفته است :

سلام.خواهش میکنم. کدتون واقعا ایرادات جدی داره:

چرا از wp_mail استفاده نمیکنید؟

مستندات: https://developer.wordpress.org/reference/functions/wp_mail/

 

وقتی دارید یک فانکشن از یک کلاس رو صدا میزنید، طبق قواعد OOP باید آرایه پاس بدید نه اسم فانکشن. در واقع به این شکل باید انجام بدید:


add_action ( 'wpo_wcpdf_pdf_created', array( $this, 'productCategory' ), 10, 2 );

که کلمه کلیدی $this به کلاس جاری اشاره میکنه.

 

شما در خط بالا شماره سفارش رو دارید. چه لزومی داره که ازش یک آبجکت ساختید و بعد در خط بعدی از همون آبجکت مجددا شماره سفارش رو دریافت کردید؟

 

با حلقه بالا که شما نوشتید فقط محصول آخری که در سفارش هست چک میشه چون شما با حلقه، همه آیتمها رو بررسی کردید و ریختید داخل دو متغیر و با هر بار اجرا، این متغیرها بروز میشن و فقط آیتم آخر میمونه!

 

خروجی این خط یک آرایه از همه دسته بندی هاست.

مستندات: https://developer.wordpress.org/reference/functions/get_categories/

ولی شما فرض رو گذاشتید بر متنی بودن نتیجه و switch زدید روی مقادیر! درست ترش اینه که از in_array استفاده کنید.

مستندات: https://www.php.net/manual/en/function.in-array.php

 

در کل کد شما خطا داره چون اصلا فانکشن رو نمیتونه داخل کلاس پیدا کنه.

بر فرض اینکه اجرا هم بشه، فقط محصول آخر بررسی میشه.

حتی این مرحله رو هم گذر کنیم ازش، شما دارید مقادیر رو رشته در نظر میگیرید که کلا آرایه هستن.

در ضمن این افزونه خودش بصورت پیشفرض ارسال ایمیل داره البته نه به تفکیک آیتمها ولی در کل کدتون هیچیش درست نیست.

 

اما هوک دقیقا همینه، بنده تست کردم و این هوک در زمان ایجاد فایل pdf با همون آبجکت class که گفتم قابل دسترسی هست. برای تست میتونید از کد زیر استفاده کنید:


error_log( print_r( $class, true ) );

با این خط، یک خطا در error_log وبسرور اضافه میشه که میتونید صحت کدتون رو بررسی کنید.

موفق باشید.

سلام و ممنون از راهنمایی هاتون :)

من این wp_mail رو هم دیدم ولی خب PHPMailer میشه ادرس ایمیل و تنظیمات اضافه رو تغییر داده در حالی که wp_mail همچین قابلت هایی رو نداره پلاگین این جور هست که مشتری بتونه ایمیل رو هم تغییر بده و یا از یه متد دیگه برای ارسال ایمیل استفاده کنه و خب صفحه مدیریت پلاگین چندتا ایتم داره برای گرفتن این اطلاعات از کاربر که اگر خواست بتونه تغییر بده در صورتی که از موردی که شما پیشنهاد کردید نمیشه این اطلاعات رو تغییر داد .

 

آخ شرمنده درست میفرمایید به هیچ عنوان حواسم بهش نبود فراموش کردم . زمانی که بخوایم یه فانکشن رو به عنوان ارگومان به یه هوک پاس بدیم برای دسترسی باید از array () با کلمه کلیدی $this استفاده کرد . حق با شماست . :D

 

مورد سوم درسته منطقی میفرمایین من فکر کردم اون order هست که به صورت ابجکت و با استفاده از wc_get_order شماره سفارش رو بگیرم دیگه به این دقت نکردم که خودش شماره سفارش هست . :o

 

برای مورد چهارم میدونم من فرض کردم سفارش شامل یه محصول باشه و نه بیشتر و به این هم فکر کردم که اگر بیشتر از یه محصول داخل سفارش باشه کدم درست نیست ولی خب در اون صورت اگه سفارش شامل دو محصول از دو دسته مختلف باشه اون موقعه دیگه فکر نکنم سویچ کیس درست باشه ؟؟!

 

در خصوص مورد های بعدی که گفتین برای تبدیل ارایه به رشته هم راه هست مثل استفاده از () implode فانکشن که برای تبدیل ارایه به رشته هست . و بله میدونم خود پلاگین اصلی به صورت پیش فرض ارسال ایمیل داره وقتی پلاگین رو دیدم متوجه شدم ولی اون دسته بندی مهم بود که اگر محصولی که داخل سفارش هست شامل یکی از اون دسته بندی ها بشه به یه ایمیل خاصی ارسال بشه .

 

ممنون دستتون درد نکنه من تغییرات رو اعمال میکنم ببینم تا مشکل رفع بشه ولی برای اون ارسال ایمیل که پیشنهاد دادین میشه راه حلی اشاره کنین .

لینک به ارسال
در 20 ساعت قبل، keeper.01 گفته است :

من این wp_mail رو هم دیدم ولی خب PHPMailer میشه ادرس ایمیل و تنظیمات اضافه رو تغییر داده در حالی که wp_mail همچین قابلت هایی رو نداره پلاگین این جور هست که مشتری بتونه ایمیل رو هم تغییر بده و یا از یه متد دیگه برای ارسال ایمیل استفاده کنه و خب صفحه مدیریت پلاگین چندتا ایتم داره برای گرفتن این اطلاعات از کاربر که اگر خواست بتونه تغییر بده در صورتی که از موردی که شما پیشنهاد کردید نمیشه این اطلاعات رو تغییر داد .

سلام. خواهش میکنم. یه صفحه تنظیمات میتونید بسازید و تنظیمات رو ذخیره کنید و بعد از همونها بخونید.

 

در 20 ساعت قبل، keeper.01 گفته است :

آخ شرمنده درست میفرمایید به هیچ عنوان حواسم بهش نبود فراموش کردم . زمانی که بخوایم یه فانکشن رو به عنوان ارگومان به یه هوک پاس بدیم برای دسترسی باید از array () با کلمه کلیدی $this استفاده کرد . حق با شماست . :D

لینک به ارسال
در 20 ساعت قبل، keeper.01 گفته است :

من این wp_mail رو هم دیدم ولی خب PHPMailer میشه ادرس ایمیل و تنظیمات اضافه رو تغییر داده در حالی که wp_mail همچین قابلت هایی رو نداره پلاگین این جور هست که مشتری بتونه ایمیل رو هم تغییر بده و یا از یه متد دیگه برای ارسال ایمیل استفاده کنه و خب صفحه مدیریت پلاگین چندتا ایتم داره برای گرفتن این اطلاعات از کاربر که اگر خواست بتونه تغییر بده در صورتی که از موردی که شما پیشنهاد کردید نمیشه این اطلاعات رو تغییر داد .

سلام. خواهش میکنم. یه صفحه تنظیمات میتونید بسازید و تنظیمات رو ذخیره کنید و بعد از همونها بخونید.

در 20 ساعت قبل، keeper.01 گفته است :

در خصوص مورد های بعدی که گفتین برای تبدیل ارایه به رشته هم راه هست مثل استفاده از () implode فانکشن که برای تبدیل ارایه به رشته هست . و بله میدونم خود پلاگین اصلی به صورت پیش فرض ارسال ایمیل داره وقتی پلاگین رو دیدم متوجه شدم ولی اون دسته بندی مهم بود که اگر محصولی که داخل سفارش هست شامل یکی از اون دسته بندی ها بشه به یه ایمیل خاصی ارسال بشه .

این مورد عملا درست نیست. کلا بررسی برای ارسال ایمیل باید داخل حلقه باشه. مثلا 5 تا محصول هست. برای هر کدوم باید ایمیل مربوطه ارسال بشه. با in_aaray خیلی ساده تر میتونید به نتیجه برسید. حتی اگه یه محصول هم باشه بازم خروجیش آرایه خواهد بود. در کل شما با implode کردن سه ظلم رو روا داشتید :)

1- آیتمهای آرایه رو ادغام کردید در صورتیکه برای سنجش وجود یه آیتم نیازی بهش نبوده.

2- بررسی رشته زمان بیشتری میبره تا بررسی وجود یک ایتم داخل ارایه و از نظر پرفورمنس و best practice کار جالبی نیست.

3- یه برنامه نویس سنیور و حرفه ای سعی میکنه کد رو ساده تر بنویسه و از KISS استفاده کنه.

سلامت و موفق باشید.

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...