رفتن به مطلب

افزودن یک متن ثابت به نوشته هایی که ویرایش میشوند


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

با سلام به دوستان

بنده دنبال یک راه حلی هستم که بشه یک تیکه متن یا کد HTML رو به هر نوشته ای که مثلاً از حالت "ایجاد" به حالت "در انتظار بررسی" تغییر می کنه، داخل رکورد همون پست توی پایگاه داده افزوده بشه.

در جریان هستم که با فیلتر the_content میشه به کل نوشته های سایت یک متنی رو اضافه کرد. ولی این روش اتصال به صورت On the fly صورت می گیره و درون پایگاه داده ذخیره نمیشه.

 

تابع یا قلابی هست که بشه این کار رو باهاش انجام داد؟

 

با تشکر...

لینک به ارسال

حقیقتش رو بخاید، کمی گیج شدم و راه به جایی نبردم!

سناریویی که بنده در نظر دارم اینه:

میخام زمانی که یک پست از حالت جدید (new) به حالت در انتظار بررسی (pending) ساخته شد، توی همون پست یک قطعه کد به انتهای محتوای پست (post_content) اضافه بشه (توی پایگاه داده).

کدی که در نظر گرفتم، اینه:

function new_to_pending_handle( $new_status, $old_status ){
    if (  ($new_status!=$old_status) && ($new_status=='draft') && ($old_status=='new') ) {
            
            global $post;

            $site_link = get_post_meta( $post->ID, 'user_submit_url', true);

            $before_text= 'متنی که قرار است قبل از نوشته نمایش داده شود.';
            $after_text= 'متنی که قرار است بعد از نوشته نمایش داده شود. ' . $site_link ;

            $this_post = array(
                    'ID' => $post->ID,
                    'post_content' => $before_text . $post->post_content . $after_text ,
                );

            wp_update_post( $this_post );

    }
}
add_action('transition_post_status', 'new_to_pending_handle', 9, 2);

اما به نظر میاد که کار نمی کنه!

از دوستان خواهش می کنم بنده رو راهنمایی کنند و اگر هم کد کامل رو حتی به همراه دریافت دستمزد به بنده بدن، سپاسگزار خواهم شد. :)

خیلی گشتم. انگار کسی توی دنیا با چنین موردی روبرو نشده که خواسته باشه کد چنین افزونۀ وردپرسی منتشر بشه!

ممنون از شما دوستان وردپرسی....

لینک به ارسال

اول شما بگو چرا میخواهی این کارو بکنی شاید راه بهتری وجود داشته باشه و میتونین شرط

($new_status!=$old_status)

  رو هم بردارین

لینک به ارسال

اول از همه از شمای "استاد" تشکر می کنم که پاسخ میدید ... :D

در پاسخ به سوال شما، بنده قصد دارم زمانی که یک نویسنده مطلبی به صورت در انتظار بررسی (pending) توی سایت ارسال می کنه، یک محتوایی در اولش و یک محتوایی هم در انتهای همون پست، توی پایگاه داده ذخیره بشه.

نمیخام این کار با فیلتر the_content انجام بشه.

بلکه قصد دارم برای همیشه به محتوای اون پست افزوده بشه.

 

برای اینکه نخواسته باشیم دستی، مثلا یک عکس رو، به انتهای هر نوشته توی سایت اضافه کنیم، این کار رو میخام انجام بدم.

لینک به ارسال

هوک

'transition_post_status'

  فقط در زمان اپدیت اجرا میشه ولی save_post بعد از insert و update این رو هم مد نظر داشته باشید

لینک به ارسال

هوک

'transition_post_status'

  فقط در زمان اپدیت اجرا میشه ولی save_post بعد از insert و update این رو هم مد نظر داشته باشید

لینک به ارسال
  • 1 ماه بعد...

ممنون از دوست گرامی مون

من فکر کردم برای اینکه بتونم به دیگران هم کمکی کرده باشم، مواردی که بنده یاد گرفتم رو اینجا هم ذکر کنم.

قلاب ها برای چنگ انداختن به هر کدام از رویدادها در وردپرس کاربرد دارند. مثلاً بنده در اینجا خواستم زمانی که یک نوشته ساخته میشه یک سری محتویات هم به انتهای هر نوشته اضافه بشه. 

خوب برای این کار روش های مختلفی وجود داره که شاید اولین و پر استفاده ترین راه کار استفاده از فیلتر the_content باشه که به این صورت ازش میشه استفاده کرد:

add_filter('the_content', 'add_to_content');

function add_to_content(){
	//Add something here
}

خیلی از افزونه های وردپرس هم از این روش استفاده می کنند. اما ما در اینجا نمیخایم از این فیلتر استفاده کنیم. این فیلتر به صورت روی هوا (On the fly) اقدام به افزودن یک محتوا به انتهای یک پست می کنه. که ما در این فرضیه میخایم به صورت دائمی محتوایی به رکوردِ نوشتۀ مورد نظر در پایگاه داده اضافه بشه. یعنی در اصل این محتوای افزودنی یه انتهای هر نوشته الحاق بشه.

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

  1. save_post
  2. wp_insert_post_data

حالا خدمت شما خواهم گفت که اختلاف بین این دو چیست.

اولی که در اصل یک action از مجموعه قلاب های وردپرس محسوب میشه، کارش انجام یم کار خاص پس از ذخیره شدن نوشته درون پایگاه داده. دقیقاً برعکس قلاب دومی که قبل از اینکه محتوایی توی پایگاه دادۀ وردپرس ذخیره بشه، تغییراتی رو روی اجزاءنوشتۀ ما ایجاد می کنه. مثلاً اگر خواسته باشیم تغییری هر چند کوچیک یا بزرگ در متن خودمون ایجاد کنیم، از هر دوی این قلاب های وردپرس می تونیم استفاده کنیم با این تفاوت که Save_post بعد از اینکه محتوای یک نوشته رو توی پایگاه داده ذخیره کرد، مجدد روی محتوای موجود در پایگاه داده تغییری رو ایجاد می کنه. در صورتی که قلاب wp_insert_post_data قبل از اینکه توی پایگاه داده ذخیره بشه تغییر رو درون محتویات نوشته خواهد داد.

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

بالاخره سعی کردم این موضوع رو برای دوستان خوب توضیح بدم و زمان بذارم و یک مقالۀ خوبی رو بنویسم. چون به هیچ عنوان راجع به این موضوع حداقل توی وب فارسی توضیحات کافی داده نشده است. حتی توی وب انگلیسی هم توضیحات به اندازۀ کافی روشن و واضح نیست. اما اگر شما این متن رو بخونید، می تونید فرق بین این دو تا قلاب رو ببینید.

حالا میریم سراغ نحوۀ استفاده از این دو تا قلاب:

save_post

add_action('save_post', 'add_to_end', 10, 3);

function add_to_end( $post_id, $post, $update){
	//Add something here
}

اگر توی کد بالا دقت کرده باشید، تابعی که ما به قلاب save_post دادیم 3 تا متغیر می گیره که می تونیم از اونها برای دست بردن در محتویات یک نوشته استفاده کنیم.

  • $post_id : که همون شناسه یا ID نوشته هست. برای به دست آوردن هر کدوم از اجزای یک نوشته ازاین شناسه می تونیم استفاده کنیم. مثلاً برای به دست آوردن متاهای پست میشه از این شناسه که یک  عدد هست هم استفاده کنیم.
  • $post :  که همون شیء نوشته است. هر آنچه از نوشته رو با استفاده از این شیء میشه به دست آورد.
  • $update : وضعیت به روز شدن نوشته را میشه با این متغیر به دست آورد. آیا به روز شده تا الان یا خیر.

 

wp_insert_post_data

add_filter('wp_insert_post_data', 'add_to_end', 10, 2);

function add_to_end( $data, $postarr){
	//Add something here
}

این قلاب هم که در اصل یک فیلتر هست، تابعی که به اون داده میشه دو تا متغیر می گیره:

  • $data : همون داده های یک پست هست که ما میتونیم جزئیات یک نوشته رو از این متغیر به دست بیاریم.
  • $postarr : این یکی هم روش دیگه ای برای به دست آوردن اجزای یک نوشته مثل عنوان، متن و .. است.

دقت داشته باشید که این قلاب باید متغیر اولی رو که میگیره، یعنی همون $data رو برگردونه. یعنی باید Return اش کنه.

خوب امیدوارم با این توضیحات تونسته باشم دوستانی که پس از بنده با این مشکل مواجه میشن رو راهنمایی کرده باشیم و توضیحاتی هر چند اندک رو راجع به این دو تا قلاب داده باشم. لازم به ذکر است که قلاب های وردپرس به دو دسته تقسیم میشن که از این قراره:

  1. action یا اکشن
  2. filter یا فیلتر

در بالا ما یک قلاب از نوع فیلتر و یک قلاب دیگه از نوع اکشن رو دیدیم.

ویرایش شده توسط jamal
لینک به ارسال

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

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

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

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

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

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

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

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

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