رفتن به مطلب

چک کردن دیتابیس و اضافه کردن یک مقدار غیر تکراری در متافیلد پست


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

درود دوستان محترم و اساتید گرامی.

پوزش میخوام بخاطر گنگ بودن عنوان سوالم.

بخاطر عدم آشنایی کافی با هوک های وردپرس نتونستم این مورد رو حل کنم. من یک فیلد در یک پست تایپ دارم. تا اینجاشو موفق شدم که وقتی یک پست جدید ساخته میشه بصورت خودکار این فیلد یک مقدار تعیین شده مثلا یک عد "1000" رو بگیره. ولی خب اینطوری این مقدار برای همه پست ها تکراری میشه. چطور میشه در این کد بزرگترین مقدار رو در دیتابیس چک کرد و بهش یک عدد اضافه کرد؟

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

امیدوارم بتونم از شما کمک بگیرم و یک چیز جدید یاد بگیرم.

کد:


add_action( 'save_post', 'myplugin_save_postdata' );

function myplugin_save_postdata( $post_id ) {

 
  if ( 'post' == $_POST['post_type'] ) {
    if ( ! current_user_can( 'edit_page', $post_id ) )
        return;
  } else {
    if ( ! current_user_can( 'edit_post', $post_id ) )
        return;
  }

  $mydata = '1000'; 

  update_post_meta( $post_id, 'id_number', $mydata );
}

 

لینک به ارسال

توضیح شما خیلی مشخص نیست که این id_number چی هست و چه کاری باید انجام بده و منظورتون از بزرگترین عدد تو دیتابیس چی هست؟ایا منظورتون اخرین id ثبت شده مثلا تو جدول postmeta هست؟

لینک به ارسال
در در 7/23/2019 at 10:01، Mobin گفته است :

توضیح شما خیلی مشخص نیست که این id_number چی هست و چه کاری باید انجام بده و منظورتون از بزرگترین عدد تو دیتابیس چی هست؟ایا منظورتون اخرین id ثبت شده مثلا تو جدول postmeta هست؟

سلام. وقتتون بخیر

بله منظورم آخرین مقدار ثبت شده در جدول postmeta هست. میخوام بصورت اتوماتیک اعدادی رو که از 1000 شروع میشه به هر پستی که منتشر میشه بدم. از قبل یک کاستوم فیلد برای اینکار گرفتم.به همون اسم id number

حالا میخوام سیستم خودش اینارو بسازه. کدی که بالاگذاشتم اینطوری عمل میکنه که وقتی مثلا افزودن نوشته رو میزنید میاد یک عدد مثلا 1000 وارد اون کاستوم فیلد میکنه و خب بعد انتشار این مقدار هم در دیتابیس ذخیره میشه.

حالا من میخوام این اعداد تکراری نباشه. یعنی وقتی اولین پست رو منتشر کردم که مقدار id_number شده 1000 پست بعدی خودش تشخیص بده که قبلا عدد 1000 ذخیره شده و بیاد بهش یک عدد اضافه کنه و بشه 1001

به همین منوال برای پست های بعدی.

لینک به ارسال

شما میتونین از تابع time استفاده کنید یک مقدار عددی به شما میده که غیر تکراری هست

یا از تابع mt_rand استفاده کنید به صورت زیر

و برای پیدا کردن اخرین مقدار اضافه شده به دیتابیس میشه از دستور max تو mysql استفاده کرد

$id_number = time();
$id_number = mt_rand(100,999).mt_rand(10,99).mt_rand(100,999);
$id_number = $wpdb->get_var("select max(meta_id) from $wpdb->postmeta");

 

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

 

ممنونم از شما.

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

این بخش از کد

$id_number = $wpdb->get_var("select max(meta_id) from $wpdb->postmeta");

خطا میده و وقتی میذارمش سایت بالا نمیاد.

یک سوال دیگه اینکه این کد بصورت رندوم عدد تولید میکنه؟

میشه کاریش کرد از 1000 شروع بشه؟ و پشت سرهم باشه؟

ویرایش شده توسط maraljoon
لینک به ارسال
در 6 دقیقه قبل، maraljoon گفته است :

ممنونم از شما.

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

این بخش از کد


$id_number = $wpdb->get_var("select max(meta_id) from $wpdb->postmeta");

خطا میده و وقتی میذارمش سایت بالا نمیاد.

یک سوال دیگه اینکه این کد بصورت رندوم عدد تولید میکنه؟

میشه کاریش کرد از 1000 شروع بشه؟ و پشت سرهم باشه؟

فکر میکنم رندومه. برام چنین عددی تولید کرد:46681909

میشه ثابتش کرد؟

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

باید قبلش $wpdb رو global  کنین

global $wpdb;
$id_number = $wpdb->get_var("select max(meta_id) from $wpdb->postmeta");

این کد تا وقتی ردیفی به جدول پست متا اضافه نشده مقدار ثابتی داره

این کد به صورت رندوم عدد تولید نمیکنه فقط مقدار اخرین id درون جدول postmeta وردپرس رو برمیگردونه

اون 2 کد دیگه که قرار داده بودم مقدار رندوم تولید میکنن

لینک به ارسال
در 8 دقیقه قبل، Mobin گفته است :

باید قبلش $wpdb رو global  کنین


global $wpdb;
$id_number = $wpdb->get_var("select max(meta_id) from $wpdb->postmeta");

این کد تا وقتی ردیفی به جدول پست متا اضافه نشده مقدار ثابتی داره

این کد به صورت رندوم عدد تولید نمیکنه فقط مقدار اخرین id درون جدول postmeta وردپرس رو برمیگردونه

اون 2 کد دیگه که قرار داده بودم مقدار رندوم تولید میکنن

ممنونم.

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

باید حتما  کد زیر رو استفاده کنم در کنارش؟

$id_number = mt_rand(100,999).mt_rand(10,99).mt_rand(100,999);

ممنون میشم واضحتر راهنماییم کنید. تو توابع وردپرس خیلی ضعیفم هنوز :D

 

 

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

باید قبلش $wpdb رو global  کنین


global $wpdb;
$id_number = $wpdb->get_var("select max(meta_id) from $wpdb->postmeta");

 

این کد به صورت رندوم عدد تولید نمیکنه فقط مقدار اخرین id درون جدول postmeta وردپرس رو برمیگردونه

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

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

چطور میتونم بهش بگم از اون متاکی خاص که مدنظرمه آخرین مقدار رو برگردونه؟

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

تونستم به این شکل انجامش بدم و جواب داد.

$mydata = $wpdb->get_var("select max( cast( meta_value as UNSIGNED ) ) FROM $wpdb->postmeta WHERE meta_key='id_number'") + 1 ;

ممنونم از راهنمایی شما. خیلی بهم کمک کرد

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

یعنی مثلا پست قبلی که منشتر شده مقدار id_number بودخ 1000

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

مشکل از این بخش از کدمه؟

  update_post_meta( $post_id, 'id_number', $mydata );

چطور تغییرش بدم که فقط پستی که ذخیره میشه این مقدار براش ذخیره بشه؟

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

بخاطر این هست که وردپرس در صفحه پست همیشه یک پست به صورت پیش نویس ذخیره میکنه تا اطلاعات پست شما رو ذخیره کنه اگه به هر دلیلی مرورگرتون بسته شد تا اونجایی که نوشتین نپره و براتون میاره

این کد چی هست؟ به چه منظوری استفاده میشه؟ شما چه کاری باهاش انجام میدین؟ انها رو توضیح بدین بهتر میشه به جواب درست رسید

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

 

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

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

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

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

الان مثلا یه پست منتشر میشه که کدش 1000 هست. یه افزودن نوشته باز بشه ولی منتشر نشه اونم کد بعدی یعنی 1001 رو میگیره. ولی پست دومی که منشتر بشه بجای اینکه بشه 1001 میشه 1002. که منطقیه.

چطور میتونم بهش بگم این اعداد رو به پست هایی بده که منتشر شدن؟ حالا چه منتشر شده باشه چه پیش نویس و یا بازبینی
 

لینک به ارسال
در در 7/30/2019 at 10:00، Mobin گفته است :

 

یه مورد هم وجود داره اینکه با این روش و این کدها فقط وقتی با اسفاده از بخش نوشته در پیشخوان پستی ساخته میشه این مقدار ذخیره میشه. اگه با استفاده از افزونه های واسطی مثل پست مهمان یا غیره که خارج از پیشخوان میتونن پست منتشر کنن پستی ساخته میشه این مقدار در جدول ذخیره نمیشه. برای این مورد باید چه کار کرد؟

لینک به ارسال
در در 7/30/2019 at 12:39، maraljoon گفته است :

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

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

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

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

الان مثلا یه پست منتشر میشه که کدش 1000 هست. یه افزودن نوشته باز بشه ولی منتشر نشه اونم کد بعدی یعنی 1001 رو میگیره. ولی پست دومی که منشتر بشه بجای اینکه بشه 1001 میشه 1002. که منطقیه.

چطور میتونم بهش بگم این اعداد رو به پست هایی بده که منتشر شدن؟ حالا چه منتشر شده باشه چه پیش نویس و یا بازبینی
 

شما میتونین به پستهای مورد نظرتون یک متا بدین مثلا اسمش باشه filter_search مقدارشم مثلا 1000 باشه خب برای پست بعدی شما کافیه مقدار اخرین filter_search که وارد کردین رو بگیرین 1 بهش اضافه کنین حالا میتونین موقع جستجو بر همین اساس عمل کنین
مثلا پستهایی که متا فیلد filter_search دارن و مقدارش مثلا بین 1000 تا 1100 هست و بر همین اساس هم میتونین مرتبشون کنین

البته باز هم من متوجه نشدم چه لزومی به چنین کدی هیت؟ mysql کوئریهای خیلی انعطاف پذیری داره

لینک به ارسال
در در 8/3/2019 at 09:43، Mobin گفته است :

 

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

لینک به ارسال

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

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

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

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

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

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

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

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

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