ชุดคลาส Model ที่ช่วยให้คุณได้รับข้อมูลได้โดยตรงจากฐานข้อมูล WordPress
Corcel คือชุดของคลาส PHP ที่สร้างขึ้นบน Eloquent ORM (จากเฟรมเวิร์ก Laravel) ซึ่งมีอินเทอร์เฟซที่คล่องแคล่วในการเชื่อมต่อและรับข้อมูลโดยตรงจากฐานข้อมูล WordPress
คุณสามารถใช้ WordPress เป็นแบ็คเอนด์ (แผงการดูแลระบบ) หรือ CMS เพื่อแทรกโพสต์ ประเภทที่กำหนดเอง ฯลฯ และแอป PHP อื่นๆ ในอีกด้านหนึ่งเพื่อสอบถามข้อมูลเหล่านั้น (เป็นเลเยอร์ Model) การใช้ Corcel กับ Laravel นั้นง่ายกว่า แต่คุณสามารถใช้งานได้กับโปรเจ็กต์ PHP ใดก็ได้ที่ใช้ Composer
ซื้อกาแฟให้ฉัน | ติดตามคอร์เซลบน Twitter
ลาราเวล | คอร์เซล |
---|---|
5.1.x | ~2.1.0 |
5.2.x | ~2.2.0 |
5.3.x | ~2.3.0 |
5.4.x | ~2.4.0 |
5.5.x | ~2.5.0 |
5.6.x | ~2.6.0 |
5.7.x | ~2.7.0 |
5.8.x | ~2.8.0 |
6.0.x | ^3.0.0 |
7.0.x | ^4.0.0 |
8.0.x | ^5.0.0 |
9.0.x | ^6.0.0 |
10.0.x | ^7.0.0 |
11.0.x | ^8.0.0 |
คุณต้องใช้ Composer เพื่อติดตั้ง Corcel ในโครงการของคุณ:
composer require jgrossi/corcel
Corcel จะลงทะเบียนตัวเองโดยใช้ Auto Discovery ของ Laravel
คุณจะต้องรวม CorcelServiceProvider
ไว้ใน config/app.php
:
' providers ' => [
/*
* Package Service Providers...
*/
Corcel Laravel CorcelServiceProvider::class,
]
ตอนนี้กำหนดค่าไฟล์กำหนดค่าของเราเพื่อให้แน่ใจว่าฐานข้อมูลของคุณได้รับการตั้งค่าอย่างถูกต้อง และเพื่อให้คุณสามารถลงทะเบียนประเภทโพสต์และรหัสย่อที่กำหนดเองได้ในวิธีที่ง่ายมาก:
รันคำสั่ง Artisan ต่อไปนี้ในเทอร์มินัลของคุณ:
php artisan vendor:publish --provider="CorcelLaravelCorcelServiceProvider"
ตอนนี้คุณมีไฟล์กำหนดค่า config/corcel.php
ซึ่งคุณสามารถตั้งค่าการเชื่อมต่อฐานข้อมูลกับตาราง WordPress และอื่นๆ อีกมากมาย
เพียงตั้งค่า connection
ต่อฐานข้อมูลที่คุณต้องการให้ Corcel ใช้ใน config/corcel.php
สมมติว่าคุณมีการเชื่อมต่อฐานข้อมูลต่อไปนี้ในไฟล์ config/database.php
ของคุณ:
// File: /config/database.php
' connections ' => [
' mysql ' => [ // for Laravel database
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' mydatabase ' ,
' username ' => ' admin '
'password' => 'secret',
' charset ' => ' utf8 ' ,
' collation ' => ' utf8_unicode_ci ' ,
' prefix ' => '' ,
' strict ' => false ,
' engine ' => null ,
],
' wordpress ' => [ // for WordPress database (used by Corcel)
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' database ' => ' mydatabase ' ,
' username ' => ' admin ' ,
' password ' => ' secret ' ,
' charset ' => ' utf8 ' ,
' collation ' => ' utf8_unicode_ci ' ,
' prefix ' => ' wp_ ' ,
' strict ' => false ,
' engine ' => null ,
],
],
ในกรณีนี้ คุณควรใช้การเชื่อมต่อ wordpress
สำหรับ Corcel ดังนั้นเพียงตั้งค่าลงในไฟล์กำหนดค่า Corcel config/corcel.php
:
' connection ' => ' wordpress ' ,
ที่นี่คุณจะต้องกำหนดค่าฐานข้อมูลให้เหมาะสมกับข้อกำหนดของ Corcel ขั้นแรก คุณควรรวมไฟล์ autoload
ของ Composer หากยังไม่ได้โหลด:
require __DIR__ . ' /vendor/autoload.php ' ;
ตอนนี้คุณต้องตั้งค่าพารามิเตอร์ฐานข้อมูล WordPress ของคุณ:
$ params = [
' database ' => ' database_name ' ,
' username ' => ' username ' ,
' password ' => ' pa$$word ' ,
' prefix ' => ' wp_ ' // default prefix is 'wp_', you can change to your own prefix
];
Corcel Database:: connect ( $ params );
คุณสามารถระบุพารามิเตอร์ Eloquent ทั้งหมดได้ แต่บางพารามิเตอร์เป็นค่าเริ่มต้น (แต่คุณสามารถแทนที่พารามิเตอร์เหล่านั้นได้)
' driver ' => ' mysql ' ,
' host ' => ' localhost ' ,
' charset ' => ' utf8 ' ,
' collation ' => ' utf8_unicode_ci ' ,
' prefix ' => ' wp_ ' , // Specify the prefix for WordPress tables, default prefix is 'wp_'
ทุกครั้งที่คุณเห็น
Post::method()
หากคุณใช้คลาส Post ของคุณเอง (ที่คุณตั้งชื่อการเชื่อมต่อ) เช่นAppPost
คุณควรใช้AppPost::method()
และไม่ใช่Post::method()
. ตัวอย่างทั้งหมดสมมติว่าคุณรู้ความแตกต่างนี้แล้ว
ในตัวอย่าง ทุกครั้งที่คุณเห็น
Post::method()
ถือว่าCorcelModelPost::method()
// All published posts
$ posts = Post:: published ()-> get ();
$ posts = Post:: status ( ' publish ' )-> get ();
// A specific post
$ post = Post:: find ( 31 );
echo $ post -> post_title ;
คุณสามารถเลือกสร้างโมเดล Post
ของคุณเอง (หรือเพจหรืออะไรก็ได้) ซึ่งขยาย CorcelPost
จากนั้นตั้งชื่อการเชื่อมต่อ (หากคุณต้องการแทนที่ค่าเริ่มต้นของ Corcel) ที่คุณใช้อยู่ในกรณีนี้ foo-bar
:
การขยายคลาส
CorcelModelPost
สามารถเพิ่มความยืดหยุ่นให้กับโปรเจ็กต์ของคุณได้ เมื่อคุณสามารถเพิ่มวิธีการและตรรกะที่กำหนดเองได้ ตามสิ่งที่คุณจำเป็นต้องใช้จากฐานข้อมูล WordPress ของคุณ
<?php // File: app/Post.php
namespace App ;
use Corcel Model Post as Corcel ;
class Post extends Corcel
{
protected $ connection = ' foo-bar ' ;
public function customMethod () {
//
}
}
ตอนนี้คุณสามารถดึงข้อมูลฐานข้อมูล WP โดยใช้คลาสของคุณเอง:
$ posts = App Post:: all (); // using the 'foo-bar' connection
เพียงจำไว้ว่าคุณไม่จำเป็นต้องขยายคลาส
Post
ของเรา คุณสามารถใช้CorcelModelPost
และโมเดลอื่น ๆ ทั้งหมดได้โดยไม่มีปัญหา
หมายเหตุ: ใน Corcel v1 คุณสามารถบันทึกข้อมูลเมตาได้โดยใช้เมธอด
Post::save()
นั่นไม่ได้รับอนุญาตอีกต่อไป ใช้เมธอดsaveMeta()
หรือcreateMeta()
(ดูด้านล่าง) เพื่อบันทึกเมตาของโพสต์
คุณสามารถดึงข้อมูลเมตาจากโพสต์ได้เช่นกัน
// Get a custom meta value (like 'link' or whatever) from a post (any type)
$ post = Post:: find ( 31 );
echo $ post -> meta -> link ; // OR
echo $ post -> fields -> link ;
echo $ post -> link ; // OR
หากต้องการสร้างหรืออัปเดตข้อมูลเมตาจากผู้ใช้เพียงใช้เมธอด saveMeta()
หรือ saveField()
พวกเขาส่งคืน bool
เหมือนเมธอด Eloquent save()
$ post = Post:: find ( 1 );
$ post -> saveMeta ( ' username ' , ' jgrossi ' );
คุณสามารถบันทึกข้อมูลเมตาจำนวนมากในเวลาเดียวกันได้เช่นกัน:
$ post = Post:: find ( 1 );
$ post -> saveMeta ([
' username ' => ' jgrossi ' ,
' url ' => ' http://jgrossi.com ' ,
]);
คุณยังมีเมธอด createMeta()
และ createField()
ที่ทำงานเหมือนกับเมธอด saveX()
แต่ใช้สำหรับการสร้างและส่งคืนอินสแตนซ์ PostMeta
ที่สร้างขึ้นเท่านั้น แทนที่จะเป็น bool
$ post = Post:: find ( 1 );
$ postMeta = $ post -> createMeta ( ' foo ' , ' bar ' ); // instance of PostMeta class
$ trueOrFalse = $ post -> saveMeta ( ' foo ' , ' baz ' ); // boolean
มีความเป็นไปได้หลายประการในการสืบค้นโพสต์ตามฟิลด์ที่กำหนดเอง (เมตา) โดยใช้ขอบเขตในคลาส Post
(หรือโมเดลอื่น ๆ ที่ใช้ลักษณะ HasMetaFields
):
หากต้องการตรวจสอบว่ามีคีย์เมตาอยู่หรือไม่ ให้ใช้ขอบเขต hasMeta()
:
// Finds a published post with a meta flag.
$post = Post::published()->hasMeta('featured_article')->first();
หากคุณต้องการจับคู่เมตาฟิลด์อย่างแม่นยำ คุณสามารถใช้ขอบเขต hasMeta()
กับค่าได้
// Find a published post which matches both meta_key and meta_value.
$ post = Post:: published ()-> hasMeta ( ' username ' , ' jgrossi ' )-> first ();
หากคุณต้องการจับคู่เมตาฟิลด์หลายรายการ คุณสามารถใช้ขอบเขต hasMeta()
ที่ส่งผ่านอาร์เรย์เป็นพารามิเตอร์ได้:
$ post = Post:: hasMeta ([ ' username ' => ' jgrossi ' ])-> first ();
$ post = Post:: hasMeta ([ ' username ' => ' jgrossi ' , ' url ' => ' jgrossi.com ' ])-> first ();
// Or just passing the keys
$ post = Post:: hasMeta ([ ' username ' , ' url ' ])-> first ();
หากคุณต้องการจับคู่สตริงที่ไม่คำนึงถึงขนาดตัวพิมพ์ หรือจับคู่กับไวด์การ์ด คุณสามารถใช้ขอบเขต hasMetaLike()
กับค่าได้ ซึ่งใช้ตัวดำเนินการ SQL LIKE
ดังนั้นให้ใช้ '%' เป็นตัวดำเนินการไวด์การ์ด
// Will match: 'J Grossi', 'J GROSSI', and 'j grossi'.
$ post = Post:: published ()-> hasMetaLike ( ' author ' , ' J GROSSI ' )-> first ();
// Using % as a wildcard will match: 'J Grossi', 'J GROSSI', 'j grossi', 'Junior Grossi' etc.
$ post = Post:: published ()-> hasMetaLike ( ' author ' , ' J%GROSSI ' )-> first ();
คลาส Post
รองรับ "นามแฝง" ดังนั้นหากคุณตรวจสอบคลาส Post
คุณควรสังเกตนามแฝงบางตัวที่กำหนดไว้ในอาร์เรย์ $aliases
แบบคงที่ เช่น title
สำหรับ post_title
และ content
สำหรับ post_content
$ post = Post:: find ( 1 );
$ post -> title === $ post -> post_title ; // true
หากคุณกำลังขยายคลาส Post
เพื่อสร้างคลาสของคุณเอง คุณสามารถใช้ $aliases
ได้เช่นกัน เพียงเพิ่มนามแฝงใหม่ให้กับคุณสมบัติคงที่ภายในคลาสของคุณเองและมันจะสืบทอดนามแฝงทั้งหมดจากคลาส Post
หลักโดยอัตโนมัติ:
class A extends Corcel Post
{
protected static $ aliases = [
' foo ' => ' post_foo ' ,
];
}
$ a = A:: find ( 1 );
echo $ a -> foo ;
echo $ a -> title ; // from Post class
หากต้องการเรียงลำดับโพสต์คุณสามารถใช้ขอบเขต newest()
และ oldest()
สำหรับทั้งคลาส Post
และ User
:
$ newest = Post:: newest ()-> first ();
$ oldest = Post:: oldest ()-> first ();
หากต้องการเรียงลำดับโพสต์เพียงใช้วิธี Eloquent paginate()
:
$ posts = Post:: published ()-> paginate ( 5 );
foreach ( $ posts as $ post ) {
// ...
}
หากต้องการแสดงลิงก์การแบ่งหน้าเพียงเรียกเมธอด links()
:
{{ $ posts -> links () }}
หากคุณต้องการเรียกข้อมูลฟิลด์ที่กำหนดเองที่สร้างโดยปลั๊กอิน Advanced Custom Fields (ACF) คุณต้องติดตั้งปลั๊กอิน corcel/acf
- คลิกที่นี่เพื่อดูข้อมูลเพิ่มเติม - และเรียกฟิลด์ที่กำหนดเองดังนี้:
$ post = Post:: find ( 123 );
echo $ post -> acf -> some_radio_field ;
$ repeaterFields = $ post -> acf -> my_repeater_name ;
เพื่อหลีกเลี่ยงการสืบค้น SQL ที่ไม่จำเป็น เพียงตั้งค่าประเภทฟิลด์ที่คุณต้องการ โดยปกติแล้ว จำเป็นต้องมีแบบสอบถาม SQL สองคำสั่งเพื่อให้ได้ประเภทฟิลด์ ดังนั้นหากคุณต้องการระบุ แสดงว่าคุณกำลังข้ามแบบสอบถามเพิ่มเติมเหล่านั้น:
$ post = Post:: find ( 123 );
echo $ post -> acf -> text ( ' text_field_name ' );
echo $ post -> acf -> boolean ( ' boolean_field_name ' );
คุณสามารถทำงานกับประเภทโพสต์ที่กำหนดเองได้เช่นกัน คุณสามารถใช้เมธอด type(string)
หรือสร้างคลาสของคุณเองได้
// using type() method
$ videos = Post:: type ( ' video ' )-> status ( ' publish ' )-> get ();
// using your own class
class Video extends Corcel Post
{
protected $ postType = ' video ' ;
}
$ videos = Video:: status ( ' publish ' )-> get ();
การใช้เมธอด type()
จะทำให้ Corcel ส่งคืนออบเจ็กต์ทั้งหมดเป็น CorcelPost
การใช้คลาสที่กำหนดเองของคุณทำให้คุณมีข้อได้เปรียบในการปรับแต่งคลาส รวมถึงวิธีการและคุณสมบัติที่กำหนดเอง ส่งคืนออบเจ็กต์ทั้งหมดเป็น Video
เป็นต้น
ประเภทโพสต์ที่กำหนดเองและข้อมูลเมตา:
// Get 3 posts with custom post type (store) and show its address
$ stores = Post:: type ( ' store ' )-> status ( ' publish ' )-> take ( 3 )-> get ();
foreach ( $ stores as $ store ) {
$ storeAddress = $ store -> address ; // option 1
$ storeAddress = $ store -> meta -> address ; // option 2
$ storeAddress = $ store -> fields -> address ; // option 3
}
ทุกครั้งที่คุณเรียกบางอย่างเช่น Post::type('video)->first()
หรือ Video::first()
คุณจะได้รับอินสแตนซ์ CorcelModelPost
หากคุณเลือกที่จะสร้างคลาสใหม่สำหรับประเภทโพสต์ที่คุณกำหนดเอง คุณสามารถให้คลาสนี้ถูกส่งคืนสำหรับอินสแตนซ์ทั้งหมดของประเภทโพสต์นั้น
แทนที่จะเรียกเมธอด Post::registerPostType()
สำหรับประเภทโพสต์แบบกำหนดเองทั้งหมดที่คุณต้องการลงทะเบียน เพียงใช้ไฟล์ปรับแต่งของ Corcel และแมปโพสต์แบบกำหนดเองทั้งหมดและคลาสของมัน พวกเขาจะถูกลงทะเบียนโดยอัตโนมัติสำหรับคุณ:
' post_types ' => [
' video ' => App Video::class,
' foo ' => App Foo::class,
]
ดังนั้นทุกครั้งที่คุณสืบค้นประเภทโพสต์ที่กำหนดเอง อินสแตนซ์ที่แมปไว้จะถูกส่งคืน
สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณตั้งใจที่จะรับคอลเลกชันของโพสต์ประเภทต่างๆ (เช่น เมื่อดึงข้อมูลโพสต์ที่กำหนดไว้ในเมนู)
//all objects in the $videos Collection will be instances of Post
$ videos = Post:: type ( ' video ' )-> status ( ' publish ' )-> get ();
// register the video custom post type and its particular class
Post:: registerPostType ( ' video ' , ' AppVideo ' )
//now all objects in the $videos Collection will be instances of Video
$ videos = Post:: type ( ' video ' )-> status ( ' publish ' )-> get ();
คุณยังสามารถทำเช่นนี้กับคลาสแบบฝัง เช่น เพจหรือโพสต์ เพียงลงทะเบียนคลาสเพจหรือโพสต์ด้วยสตริงประเภทโพสต์ที่เกี่ยวข้อง และออบเจ็กต์นั้นจะถูกส่งกลับแทนที่จะเป็นค่าเริ่มต้น
คุณสามารถแมปรหัสย่อทั้งหมดที่คุณต้องการภายในไฟล์ config/corcel.php
ใต้คีย์ 'shortcodes'
ในกรณีนี้ คุณควรสร้างคลาสของคุณเองที่ implements
อินเทอร์เฟซ CorcelShortcode
ซึ่งต้องใช้เมธอด render()
:
' shortcodes ' => [
' foo ' => App Shortcodes FooShortcode::class,
' bar ' => App Shortcodes BarShortcode::class,
],
นี่คือคลาสรหัสย่อตัวอย่าง:
class FakeShortcode implements Corcel Shortcode
{
/**
* @param ShortcodeInterface $shortcode
* @return string
*/
public function render ( ShortcodeInterface $ shortcode )
{
return sprintf (
' html-for-shortcode-%s-%s ' ,
$ shortcode -> getName (),
$ shortcode -> getParameter ( ' one ' )
);
}
}
คุณสามารถเพิ่มรหัสย่อได้โดยการเรียกวิธี addShortcode
ใน Post
model :
// [gallery id="1"]
Post:: addShortcode ( ' gallery ' , function ( $ shortcode ) {
return $ shortcode -> getName () . ' . ' . $ shortcode -> getParameter ( ' id ' );
});
$ post = Post:: find ( 1 );
echo $ post -> content ;
Laravel 5.5 ใช้ Package Auto-Discovery ดังนั้นคุณไม่จำเป็นต้องเพิ่ม ServiceProvider ด้วยตนเอง
หากคุณใช้ Laravel เราขอแนะนำให้เพิ่มตัวจัดการรหัสย่อของคุณใน AppProvidersAppServiceProvider
ในวิธี boot
รหัสย่อจะถูกแยกวิเคราะห์ด้วยไลบรารี Thunderer/รหัสย่อ
มี parsers ที่แตกต่างกันหลายตัว RegularParser
มีความถูกต้องทางเทคนิคมากที่สุดและมีให้ตามค่าเริ่มต้น สิ่งนี้เหมาะสำหรับกรณีส่วนใหญ่ อย่างไรก็ตาม หากคุณพบความผิดปกติบางประการในการแยกวิเคราะห์รหัสย่อของคุณ คุณอาจต้องกำหนดค่า Corcel ให้ใช้ WordpressParser
ซึ่งตรงกับ regex รหัสย่อของ WordPress อย่างซื่อสัตย์มากกว่า ในการดำเนินการนี้ หากคุณใช้ Laravel ให้แก้ไขไฟล์ config/corcel.php
และยกเลิกการใส่หมายเหตุ parser ที่คุณต้องการ หรือคุณสามารถแทนที่สิ่งนี้ด้วย parser ของคุณเองได้
' shortcode_parser ' => Thunder Shortcode Parser RegularParser::class,
// 'shortcode_parser' => ThunderShortcodeParserWordpressParser::class,
หากคุณไม่ได้ใช้ Laravel คุณสามารถทำได้ในรันไทม์ โดยเรียกใช้เมธอด setShortcodeParser()
จากคลาสใดๆ ก็ตามที่ใช้ลักษณะ Shortcodes
เช่น Post
เป็นต้น
$ post -> setShortcodeParser ( new WordpressParser ());
echo $ post -> content ; // content parsed with "WordpressParser" class
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับแพ็คเกจรหัสย่อ คลิกที่นี่
คุณสามารถรับการจัดหมวดหมู่สำหรับโพสต์เฉพาะได้ เช่น:
$ post = Post:: find ( 1 );
$ taxonomy = $ post -> taxonomies ()-> first ();
echo $ taxonomy -> taxonomy ;
หรือคุณสามารถค้นหาโพสต์โดยใช้อนุกรมวิธาน:
$ post = Post:: taxonomy ( ' category ' , ' php ' )-> first ();
คุณยังสามารถรับรูปแบบโพสต์ได้ เช่น ฟังก์ชัน WordPress get_post_format()
:
echo $ post -> getFormat (); // should return something like 'video', etc
เพจก็เหมือนกับประเภทโพสต์ที่กำหนดเอง คุณสามารถใช้ Post::type('page')
หรือคลาส CorcelModelPage
use Corcel Model Page ;
// Find a page by slug
$ page = Page:: slug ( ' about ' )-> first (); // OR
$ page = Post:: type ( ' page ' )-> slug ( ' about ' )-> first ();
echo $ page -> post_title ;
รับหมวดหมู่หรืออนุกรมวิธานหรือโหลดโพสต์จากหมวดหมู่ใดหมวดหมู่หนึ่ง มีหลายวิธีในการบรรลุเป้าหมาย
// all categories
$ cat = Taxonomy:: category ()-> slug ( ' uncategorized ' )-> posts -> first ();
echo " <pre> " ; print_r ( $ cat -> name ); echo " </pre> " ;
// only all categories and posts connected with it
$ cat = Taxonomy:: where ( ' taxonomy ' , ' category ' )-> with ( ' posts ' )-> get ();
$ cat -> each ( function ( $ category ) {
echo $ category -> name ;
});
// clean and simple all posts from a category
$ cat = Category:: slug ( ' uncategorized ' )-> posts -> first ();
$ cat -> posts -> each ( function ( $ post ) {
echo $ post -> post_title ;
});
รับไฟล์แนบและ/หรือการแก้ไขจาก Post
หรือ Page
$ page = Page:: slug ( ' about ' )-> with ( ' attachment ' )-> first ();
// get feature image from page or post
print_r ( $ page -> attachment );
$ post = Post:: slug ( ' test ' )-> with ( ' revision ' )-> first ();
// get all revisions from a post or page
print_r ( $ post -> revision );
รับภาพขนาดย่อสำหรับ Post
หรือ Page
$ post = Post:: find ( 1 );
// Retrieve an instance of CorcelModelMetaThumbnailMeta.
print_r ( $ post -> thumbnail );
// For convenience you may also echo the thumbnail instance to get the URL of the original image.
echo $ post -> thumbnail ;
หากต้องการดึงข้อมูลขนาดภาพขนาดย่อโดยเฉพาะคุณอาจเรียกใช้เมธอด ->size()
บนวัตถุภาพขนาดย่อและส่งพารามิเตอร์สตริงขนาดภาพขนาดย่อ (เช่น thumbnail
หรือ medium
) หากมีการสร้างภาพขนาดย่อ วิธีการนี้จะส่งคืนอาร์เรย์ของข้อมูลเมตาของรูปภาพ มิฉะนั้น URL ของรูปภาพต้นฉบับจะถูกส่งกลับเป็นทางเลือก
if ( $ post -> thumbnail !== null ) {
/**
* [
* 'file' => 'filename-300x300.jpg',
* 'width' => 300,
* 'height' => 300,
* 'mime-type' => 'image/jpeg',
* 'url' => 'http://localhost/wp-content/uploads/filename-300x300.jpg',
* ]
*/
print_r ( $ post -> thumbnail -> size ( Corcel Model Meta ThumbnailMeta:: SIZE_THUMBNAIL ));
// http://localhost/wp-content/uploads/filename.jpg
print_r ( $ post -> thumbnail -> size ( ' invalid_size ' ));
}
ใน Corcel เวอร์ชันก่อนหน้า คลาสนี้เรียกว่า
Options
แทนที่จะเป็นOption
(เอกพจน์) ดังนั้นดูแลการใช้คลาสนี้ในรูปแบบเอกพจน์เสมอโดยเริ่มจากv2.0.0
Option::getAll()
วิธีการถูกลบออกใน Corcel 2+ ในความโปรดปรานของOption::asArray($keys [])
คุณสามารถใช้คลาส Option
เพื่อรับข้อมูลจากตาราง wp_options
:
$ siteUrl = Option:: get ( ' siteurl ' );
คุณยังสามารถเพิ่มตัวเลือกใหม่ได้:
Option:: add ( ' foo ' , ' bar ' ); // stored as string
Option:: add ( ' baz ' , [ ' one ' => ' two ' ]); // this will be serialized and saved
คุณสามารถรับตัวเลือกทั้งหมดได้ในอาร์เรย์ธรรมดา:
$ options = Option:: asArray ();
echo $ options [ ' siteurl ' ];
หรือคุณสามารถระบุเฉพาะคีย์ที่คุณต้องการรับ:
$ options = Option:: asArray ([ ' siteurl ' , ' home ' , ' blogname ' ]);
echo $ options [ ' home ' ];
หากต้องการรับเมนูตามตัวทาก ให้ใช้ไวยากรณ์ด้านล่าง รายการเมนูจะถูกโหลดในตัวแปร items
(เป็นคอลเลกชันของออบเจ็กต์ CorcelModelMenuItem
)
รายการเมนูที่รองรับในปัจจุบัน ได้แก่ เพจ โพสต์ ลิงก์แบบกำหนดเอง และหมวดหมู่
เมื่อคุณมีอินสแตนซ์ของคลาส MenuItem
แล้ว หากคุณต้องการใช้อินสแตนซ์ดั้งเดิม (เช่น หน้าหรือ Term ดั้งเดิม) เพียงเรียกใช้เมธอด MenuItem::instance()
วัตถุ MenuItem
เป็นเพียงโพสต์ที่มี post_type
เท่ากับ nav_menu_item
:
$ menu = Menu:: slug ( ' primary ' )-> first ();
foreach ( $ menu -> items as $ item ) {
echo $ item -> instance ()-> title ; // if it's a Post
echo $ item -> instance ()-> name ; // if it's a Term
echo $ item -> instance ()-> link_text ; // if it's a custom link
}
instance()
วิธีการจะส่งคืนวัตถุที่ตรงกัน:
Post
อินสแตนซ์สำหรับรายการเมนู post
Page
สำหรับรายการเมนู page
CustomLink
สำหรับรายการเมนู custom
Term
คำศัพท์สำหรับรายการเมนู category
ในการจัดการเมนูหลายระดับ ให้วนซ้ำรายการเมนูทั้งหมดเพื่อให้อยู่ในระดับที่ถูกต้อง เป็นต้น
คุณสามารถใช้ MenuItem::parent()
วิธีการดึงอินสแตนซ์หลักของรายการเมนูนั้น:
$ items = Menu:: slug ( ' foo ' )-> first ()-> items ;
$ parent = $ items -> first ()-> parent (); // Post, Page, CustomLink or Term (category)
หากต้องการจัดกลุ่มรายการเมนูตามพาเรนต์ คุณสามารถใช้เมธอด ->groupBy()
ในคอลเล็กชัน $menu->items
โดยจัดกลุ่มรายการเมนูตาม $item->parent()->ID
หากต้องการอ่านเพิ่มเติมเกี่ยวกับเมธอด groupBy()
โปรดดูเอกสารประกอบของ Laravel
คุณสามารถจัดการผู้ใช้ในลักษณะเดียวกับที่คุณทำงานกับโพสต์:
// All users
$ users = User:: get ();
// A specific user
$ user = User:: find ( 1 );
echo $ user -> user_login ;
หากคุณใช้ Laravel 5.4 หรือเก่ากว่า ตรวจสอบให้แน่ใจว่าคุณได้ลงทะเบียนผู้ให้บริการ CorcelServiceProvider
แล้ว
จากนั้นกำหนดผู้ให้บริการผู้ใช้ใน config/auth.php
เพื่ออนุญาตให้ Laravel เข้าสู่ระบบด้วยผู้ใช้ WordPress:
' providers ' => [
' users ' => [
' driver ' => ' corcel ' ,
' model ' => Corcel Model User::class,
],
],
ตอนนี้คุณสามารถใช้ส่วนหน้าของ Auth
เพื่อตรวจสอบสิทธิ์ผู้ใช้:
Auth:: validate ([
' email ' => ' [email protected] ' , // or using 'username' too
' password ' => ' secret ' ,
]);
เพื่อให้การรีเซ็ตรหัสผ่านของ Laravel ทำงานร่วมกับ Corcel ได้ เราต้องแทนที่วิธีจัดเก็บรหัสผ่านในฐานข้อมูล ในการดำเนินการนี้ คุณต้องเปลี่ยน Auth/PasswordController.php
จาก:
use App Http Controllers Controller ;
use Illuminate Foundation Auth ResetsPasswords ;
class PasswordController extends Controller
{
use ResetsPasswords;
ถึง
use App Http Controllers Controller ;
use Illuminate Foundation Auth ResetsPasswords ;
use Corcel Laravel Auth ResetsPasswords as CorcelResetsPasswords ;
class PasswordController extends Controller
{
use ResetsPasswords, CorcelResetsPasswords {
CorcelResetsPasswords::resetPassword insteadof ResetsPasswords;
}
คุณสามารถใช้คลาส AuthUserProvider
เพื่อตรวจสอบสิทธิ์ผู้ใช้ด้วยตนเอง:
$ userProvider = new Corcel Laravel Auth AuthUserProvider ;
$ user = $ userProvider -> retrieveByCredentials ([ ' username ' => ' admin ' ]);
if (! is_null ( $ user ) && $ userProvider -> validateCredentials ( $ user , [ ' password ' => ' admin ' ])) {
// successfully login
}
โปรดจำไว้ว่าคุณสามารถใช้ทั้ง
username
และ
หากต้องการรันการทดสอบ phpunit ให้รันคำสั่งต่อไปนี้:
./vendor/bin/phpunit
หากคุณติดตั้งคำสั่ง global phpunit
คุณสามารถพิมพ์:
phpunit
การทดสอบทั้งหมดเขียนโดยใช้ Sqlite พร้อมด้วย :memory
ฐานข้อมูล ดังนั้นจึงรันในหน่วยความจำของคุณ การทดสอบทั้งหมดใช้ factories
และ migrations
ดูไดเร็กทอรีของ tests/database/factories
และ tests/database/migrations
สำหรับข้อมูลเพิ่มเติม
การมีส่วนร่วมทั้งหมดยินดีที่จะช่วยปรับปรุง Corcel
ก่อนที่คุณจะส่งคำขอดึง (PR) ให้พิจารณาหลักเกณฑ์ต่อไปนี้:
แยก https://github.com/corcel/corcel ใน Github;
โคลนพื้นที่เก็บข้อมูลแบบแยกส่วนของคุณ (ไม่ใช่ของ Corcel) ในเครื่องและสร้างสาขาของคุณเองตามเวอร์ชันที่คุณต้องการแก้ไข ( 2.1
, 2.2
, 2.3
, 2.4
หรือ 2.5
): git checkout -b my-fix-branch 2.5
;
ทำการเปลี่ยนแปลงโค้ดทั้งหมด อย่าลืมเขียนกรณีทดสอบอย่างน้อยหนึ่งกรณีสำหรับคุณลักษณะใดๆ ที่คุณเพิ่มหรือแก้ไขข้อบกพร่องใดๆ (หากยังไม่ได้ทดสอบ) เป้าหมายของเราคือการมีโค้ดครอบคลุมการทดสอบ 100% ดังนั้นช่วยให้เราเขียนโค้ดได้ดีขึ้น ;-) หากคุณไม่มีประสบการณ์เกี่ยวกับการทดสอบ นี่เป็นโอกาสที่ดีที่จะเรียนรู้ เพียงดูกรณีทดสอบของเราแล้วคุณจะเห็นว่ามันง่ายแค่ไหน
รันการทดสอบหน่วยในเครื่องเพื่อให้แน่ใจว่าการเปลี่ยนแปลงของคุณจะไม่ทำให้โค้ดอื่นเสียหาย
พุชสาขาใหม่ของคุณไปยังที่เก็บแบบแยกส่วนของคุณ โดยปกติแล้ว git push origin HEAD
ควรใช้งานได้
ใน GitHub อีกครั้ง ให้สร้าง Pull Request (PR) จากสาขา my-fix-branch
ที่คุณกำหนดเอง (จากพื้นที่เก็บข้อมูลที่แยกส่วนของคุณ) ไปยังสาขาที่เกี่ยวข้อง ( ตัวอย่างเช่น corcel:2.5
ไม่ใช่ corcel:master
โปรด;
รอการอนุมัติ :-)
ใบอนุญาต MIT © Junior Grossi