💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ مهدی فانی
اجرای متاباکس‌ها در شرایط خاص
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۲۱ شهریور ۱۴۰۳

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

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

برای این کار اومدم یکسری شرط درون فایل کور گذاشتم:

<?php
include_once __DIR__ . '/BaseMetaBoxes.php';
include_once __DIR__ . '/AutoLoadMetaBox.php';
class BreedMetaBoxesCore {
public function __construct() {
add_action('add_meta_boxes', [$this, 'currentScreenLoad']);
}
public function currentScreenLoad() {
$screen = get_current_screen();
if ( $screen && $screen->base === 'post' && $screen->id === 'post' ) {
global $post;
$post_id = $post->ID ?? (isset($_GET['post']) ? intval($_GET['post']) : 0);
if ($post_id) {
$post_template = get_post_meta($post_id, '_wp_page_template', true);
if ($post_template === 'page-templates/custom-breed.php') {
$this->loadEntities();
}
}
}
}
public function loadEntities() {
new DogBreedOverView();
new DogBreedScore();
new DogBreedAccording();
new DogBreedFact();
new DogBreedName();
new DogBreedHistory();
new DogBreedGroup();
new DogBreedMoreDetail();
new DogBreedCharacter();
new DogBreedProsCons();
new DogBreedVideo();
new DogBreedAppearance();
new DogBreedHealth();
new DogBreedGallery();
$test = new TestClassLog();
$test->testFunction();
}
}
$Core = new BreedMetaBoxesCore();
$Core->currentScreenLoad();

کلاس بیس من هم اینه:

<?php
abstract class BaseMetaBoxes{
protected $ID,
$title,
$callback,
$screen,
$context,
$priority;
public function __construct()
{
$this->context = 'normal';
$this->priority = 'default';
add_action('add_meta_boxes',[$this,'add_meta_box']);
add_action('save_post',[$this,'save']);
}
public function add_meta_box()
{
global $post;
if ('page-templates/custom-breed.php' == get_post_meta($post->ID, '_wp_page_template', true)) {
add_meta_box(
$this->ID,
$this->title,
[$this,'layout'],
$this->screen
);
}
}
abstract public function layout($post);
abstract public function save($post_id);
}

 

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

add_action( 'current_screen', 'load_meta_box_core_class_on_edit_post' );
function load_meta_box_core_class_on_edit_post( $screen ) {
if ( $screen->base === 'post' && $screen->post_type === 'post' ) {
include_once __DIR__ . '/class/metabox/BreedMetaBoxesCore.php';
}
}
اینجا چک کردم که حتما توی صفحه ادیت نوشته کلاس هسته لود بشه.

تا اینجا همچی درسته، متاباکس‌ها نمایش داده میشن. اما ذخیره سازی انجام نمیشه. این در حالیه که در حالت عادی همچی به درستی کار میکنه. من مطمئنم که مشکلم توی فایل هسته هست. اما نمیدونم کجای کارو اشتباه انجام دادم. میشه منو راهنمایی کنین.؟

 

در کلاس BaseMetaBoxes، باید مطمئن بشین که متاباکس‌ها تنها برای تمپلیت خاص لود بشن اما تابع save همیشه باید برای همه پست‌ها ثبت بشه تا هنگام ذخیره‌سازی فعال باشد.

پیشنهادم برای این دو قسمت کدنویسی :

class BreedMetaBoxesCore {
    public function __construct() {
        add_action('add_meta_boxes', [$this, 'currentScreenLoad']);
        add_action('save_post', [$this, 'savePost']);
    }
    public function currentScreenLoad() {
        $screen = get_current_screen();
        if ( $screen && $screen->base === 'post' && $screen->id === 'post' ) {
            global $post;
            $post_id = $post->ID ?? (isset($_GET['post']) ? intval($_GET['post']) : 0);
            if ($post_id) {
                $post_template = get_post_meta($post_id, '_wp_page_template', true);
                if ($post_template === 'page-templates/custom-breed.php') {
                    $this->loadEntities();
                }
            }
        }
    }
    public function savePost($post_id) {
        $post_template = get_post_meta($post_id, '_wp_page_template', true);
        if ($post_template === 'page-templates/custom-breed.php') {
            $this->loadEntities();
        }
    }
    public function loadEntities() {
        new DogBreedOverView();
        new DogBreedScore();
        new DogBreedAccording();
        new DogBreedFact();
        new DogBreedName();
        new DogBreedHistory();
        new DogBreedGroup();
        new DogBreedMoreDetail();
        new DogBreedCharacter();
        new DogBreedProsCons();
        new DogBreedVideo();
        new DogBreedAppearance();
        new DogBreedHealth();
        new DogBreedGallery();
    }
}

و

abstract class BaseMetaBoxes {
    protected $ID, $title, $callback, $screen, $context, $priority;
    public function __construct() {
        $this->context = 'normal';
        $this->priority = 'default';
        add_action('add_meta_boxes', [$this, 'add_meta_box']);
        add_action('save_post', [$this, 'save']);
    }
    public function add_meta_box() {
        global $post;
        if ('page-templates/custom-breed.php' == get_post_meta($post->ID, '_wp_page_template', true)) {
            add_meta_box(
                $this->ID,
                $this->title,
                [$this, 'layout'],
                $this->screen
            );
        }
    }
    public function save($post_id) {
        if ('page-templates/custom-breed.php' == get_post_meta($post_id, '_wp_page_template', true)) {
            $this->save_meta_boxes($post_id);
        }
    }
    abstract public function layout($post);
    abstract public function save_meta_boxes($post_id);
}
ابوالفضل محجوب ۲۷ شهریور ۱۴۰۳، ۰۶:۱۳