ضعیفبد نیستمتوسطخوبعالی (1 votes, average: 5٫00 out of 5)
Loading...

نحوه استفاده از وردپرس به عنوان Backend برای Laravel

به نام خدا

توجه داشته باشید راه های مختلفی برای استفاده از وردپرس به عنوان Backend برای اپلیکیشن Laravel وجود دارد و شما می توانید از پست های وردپرس و لاروال برای فهرستی از بسته های شخص ثالث و منابع دیگر که برای حل این کار مشابه ایجاد شده است، بیابید و استفاده کنید. گزینه های اصلی این است که یا به پایگاه داده وردپرس متصل باشند( از API بیارید) و یا داده ها از یک سیستم به دیگری همگام سازی شوند.

من گزینه همگام سازی را انتخاب می کنم چون من همه چیز را از هم جدا کردم. وقتی که تحقیق می کردم، یک بسته به نام WordPressToLaravel پیدا کردم که این کار را می کند، اما، تنها با سایت های میزبانی wordpress.com کار می کند.

من تصمیم گرفتم سیستم خودم را برای کار با نصب وردپرس خود میزبانی کنم. این روش جلوتر نیاز به کار بیشتری دارد، اما اجازه می دهد که سایت من یک برنامه معمول Laravel باشد که به راحتی می توانم آن را بهبود ببخشم و در صورت نیاز گسترش دهم.

هنگامی که من محتوای همگام سازی شده را داشته باشم، پس از آن به وسیله Scheduler Laravel ، به عنوان یک کار تکراری تنظیم کردم، بنابراین کاملا خودکار است.

راه اندازی من هم کاملا سفارشی برای نیازهایم است. من فقط می خواستم پست ها، دسته ها و برچسب ها را طراحی کنم. صفحات و بخش های دیگر همه توسط فایل های استاتیک یا سایر API ها هدایت می شوند.

 

API وردپرس

وردپرس توسط یک API ارسال نمی شود با این حال، جامعه پلاگین به نام WP Rest API ساخته است که اجازه می دهد تا هر وبلاگ یک API jSON داشته باشد.

در این مورد، من فقط درخواست خواندن را انجام می دهم که نیازی به احراز هویت ندارد.این باعث می شود خواندن و بارگیری داده ها آسان و کد پیچیده را ساده کند.

در اینجا کلاس اصلی من برای گرفتن یک لیست از پست ها است:

class WpApi { protected $url = 'http://site.com/wp-json/wp/v2/'; public function importPosts($page = 1) { $posts = collect($this->getJson($this->url . 'posts/?_embed&filter[orderby]=modified&page=' . $page)); foreach ($posts as $post) { $this->syncPost($post); } } protected function getJson($url) { $response = file_get_contents($url, false); return json_decode( $response ); } }

در حال حاضر وقتی به مسیر WpAPI-> importPosts  می روید اولین صفحه نتایج را می گیرید. رشته مورد پرس و جو باید ذکر شود زیرا دارای چند جمله خاص است. اولین بار _embed که تمام داده های اضافی مانند _embed تصویر، دسته ها و برچسب ها را جاسازی می کند.

بعد، ما نیاز به همگام سازی پست با پایگاه داده داریم. در اینجا چگونگی تنظیم آن وجود دارد:

protected function syncPost($data) { $found = Post::where('wp_id', $data->id)->first(); if (! $found) { return $this->createPost($data); } if ($found and $found->updated_at->format("Ymd H:i:s") < $this->carbonDate($data->modified)->format("Ymd H:i:s")) { return $this->updatePost($found, $data); } } protected function carbonDate($date) { return Carbon::parse($date); }

برای این مرحله، یک فیلد wp_id را به جدول پستهای خودم اضافه کردم که یکی از آنها یک پایگاه داده محلی و وردپرس است.

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

createPost و updatePost به طور معمول درج یا به روزرسانی Laravel Eloquent است. در اینجا کد ایجاد شده است:

protected function createPost($data) { $post = new Post(); $post->id = $data->id; $post->wp_id = $data->id; $post->user_id = $this->getAuthor($data->_embedded->author); $post->title = $data->title->rendered; $post->slug = $data->slug; $post->featured_image = $this->featuredImage($data->_embedded); $post->featured = ($data->sticky) ? 1 : null; $post->excerpt = $data->excerpt->rendered; $post->content = $data->content->rendered; $post->format = $data->format; $post->status = 'publish'; $post->publishes_at = $this->carbonDate($data->date); $post->created_at = $this->carbonDate($data->date); $post->updated_at = $this->carbonDate($data->modified); $post->category_id = $this->getCategory($data->_embedded->{"wp:term"}); $post->save(); 
$this->syncTags($post, $data->_embedded->{"wp:term"}); return $post; }

اگر به دقت نگاه کنید، موارد خاصی نظیر نویسنده، تصویر برجسته، رده و برچسب وجود دارد. آنها از _embed در رشته پرس و جو اصلی استفاده کردند و همگام سازی این داده ها فقط انجام همان چیزی است که قبلا انجام شده است.

public function featuredImage($data) { if (property_exists($data, "wp:featuredmedia")) { $data = head($data->{"wp:featuredmedia"}); if (isset($data->source_url)) { return $data->source_url; } } return null; } public function getCategory($data) { $category = collect($data)->collapse()->where('taxonomy', 'category')->first(); $found = Category::where('wp_id', $category->id)->first(); if ($found) { return $found->id; } $cat = new Category(); $cat->id = $category->id; $cat->wp_id = $category->id; $cat->name = $category->name; $cat->slug = $category->slug; $cat->description = ''; $cat->save(); return $cat->id; } private function syncTags(Post $post, $tags) { $tags = collect($tags)->collapse()->where('taxonomy', 'post_tag')->pluck('name')->toArray(); if (count($tags) > ) { $post->setTags($tags); } }

برای دسته ای که من از اول رده خارج می کنم،به عنوان یک پست اختصاص داده می شود زیرا فقط یک پست برای هر دسته می خواهم، سپس در syncTags، از Package Tag ها توسط Cartalyst استفاده می شود .

 

همچنین بخوانید:  آموزش CCNP Routing - قسمت پنجم - Load Balancing در EIGRP

ایجاد یک فرمان برنامه ریزی شده

گام نهایی برای تکمیل ورودی ها، ایجاد یک کار برنامه ریزی شده است تا پست ها را به صورت خودکار منتشر کنند. من یک فرمان به نام Importer از طریق Artisan ایجاد کردم:

php artisan make:console Importer

سپس در روش دسته:

$page = ($this->argument('page')) ? $this->argument('page') : 1; $this->wpApi->importPosts($page);

در نهایت، در Console / Kernel این را برای هر دقیقه اجرا کنید:

$schedule->command('import:wordpress') ->everyMinute();

اکنون هر لحظه ای از هر روز تلاش می کند تا داده ها را همگام سازی کند یا پست ها را ایجاد، به روزرسانی یا نادیده بگیرد.

 

اطلاعات بیشتر

این یک مفهوم اساسی در این باره است که چگونه این ویژگی را تنظیم کنیم، و تنها سطح را بر روی آنچه که می توان انجام داد، خراشید. برای مثال، من به شدت تمام داده های DB را در داخل سایت و در طول این فرایند همگام سازی می کنم اگر چیزی به روز می شود، پس حافظه پنهان مرتبط پاک می شود.

امیدوارم این کمک کند که استفاده از وردپرس به عنوان یک مدیریت پشتیبان، سخت نیست و در عین حال به شما مزایایی مانند ایجاد پست از موبایل، استفاده از آن مدیر رسانه و حتی نوشتن در Markdown با Jetpack می دهد.

همچنین ببینید

آموزش ارسال و دریافت sms در لاراول

ارسال و دریافت پیش نمایش پیام های Laravel با Nexmo

با توجه به استقبال شما از آموزش های لاراول میهن لرن است، تصمیم گرفتیم مجموعه مقالات …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *