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

این آموزش انتظار دارد که شما با توسعه تم وردپرس و در حالت ایده آل با افزونه وردپرس Advanced Custom Fields (ACF) آشنا باشید.

پیاده سازی

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

ساختار تم

بیایید در مورد پرونده های مهم بحث کنیم:

  • این single-chart.php فایلی که ثبت می کند صفحه نمودار واحد قالب سفارشی با single-chart.js فایل. هر دو مسئول نمایش یک نمودار واحد خواهند بود.
  • این tabs.php فایلی که ثبت می کند صفحه برگه ها قالب سفارشی با multiple-charts.js فایل. هر دو مسئول نشان دادن برگه های بوت استرپ هستند که حاوی نمودار هستند.
  • داخل را functions.php فایل، موارد مورد نیاز را اضافه می کنم بوت استرپ و Chart.js فایل ها – همان نسخه هایی که در CodePen وجود دارد نسخه ی نمایشی از آموزش قبلی در این تابع، منطق تولید داده های نمودار مورد نیاز وجود خواهد داشت.
  • درون acf پوشه، تمام فیلدهای اضافی را که قرار است استفاده کنم به دو روش صادر می کنم تا بتوانید دوباره از آنها در تم های خود استفاده کنید—در یک لحظه خواهید دید که در مورد چه چیزی صحبت می کنم.
صادرات فیلدهای ACFصادرات فیلدهای ACFصادرات فیلدهای ACF

ساختار تم اینجاست:

فایل های تمفایل های تمفایل های تم

برای راحتی شما، طبق معمول، تمام دارایی های موضوع در دسترس خواهند بود مخزن GitHub.

ایجاد فیلدهای اضافی

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

1
{
2
  bars: {
3
    bar1: ["25", "76", "64", "33", "85", "46", "25"],
4
    bar2: ["32", "68", "77", "29", "88", "65", "60"]
5
  },
6
    برچسب ها: [
7
    "Label 1",
8
    "Label 2",
9
    "Label 3",
10
    "Label 4",
11
    "Label 5",
12
    "Label 6",
13
    "Label 7"
14
15
  legends: { legend1: "Male", legend2: "Female" },
16
  title: "Gender Comparison Graph"
17
}

برای ایجاد داده ها، به تعدادی فیلد نیاز داریم. بسیاری از افزونه ها می توانند به ما در ایجاد فیلدهای اضافی مانند فیلدهای سفارشی پیشرفته (ACF) افزونه، غلاف پلاگین و غیره برای این تمرین، من را انتخاب می کنم نسخه ACF PRO تا از آن بهره ببرند زمینه محتوای انعطاف پذیر.

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

باز هم همانطور که در بالا ذکر شد، تمام فیلدهای ACF هم به صورت JSON و هم PHP صادر می شوند و در داخل acf پوشه تم

به عنوان یک اسپویلر، برای اینکه به شما ثابت کنم که علیرغم افزونه های وردپرس، ابزارهای دیگر به ما اجازه می دهند که فیلدهای صفحه اضافی ایجاد کنیم، به شما نشان می دهم که چگونه یک صفحه ایجاد کنید. تنظیمات پوسته صفحه با استفاده از میدان های کربن در یک آموزش آینده.

یک نمودار واحد ایجاد کنید

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

طرح تک نمودارطرح تک نمودارطرح تک نمودار

با استفاده از ACF، یک گروه فیلد جدید ایجاد می کنیم و آن را به صفحه ای که می خواهیم ترسیم می کنیم – در مورد من، این صفحه با صفحه نمودار واحد قالب.

فیلد گروه برای یک نمودار واحدفیلد گروه برای یک نمودار واحدفیلد گروه برای یک نمودار واحد

در داخل آن گروه، سه زیر فیلد را تعریف می کنیم.

فیلدهای هر نمودارفیلدهای هر نمودارفیلدهای هر نمودار

درون افسانه ها فیلد فرعی، دو فیلد اضافی را برای برچسب گذاری مجموعه داده ها که در پایین نمودار ظاهر می شوند، مشخص می کنیم.

فیلدهای فرعی افسانهفیلدهای فرعی افسانهفیلدهای فرعی افسانه

این ردیف ها فیلد محتوای انعطاف پذیر به ما امکان می دهد بی نهایت ردیف ایجاد کنیم که در آن هر ردیف یک مجموعه از نوارهای عمودی را نشان می دهد – آن را به عنوان یک تکرار کننده با ردیف هایی که می توان جمع کرد در نظر بگیرید.

مجموعه ای از میله های عمودیمجموعه ای از میله های عمودیمجموعه ای از میله های عمودی
فیلدهای فرعی سطرهافیلدهای فرعی سطرهافیلدهای فرعی سطرها

پس از تنظیم فیلدها، به مدیر صفحه مورد نظر می رویم و آنها را با داده پر می کنیم.

داده های نمودار واحدداده های نمودار واحدداده های نمودار واحد

در single-chart.php فایل، ما قبلاً یک مرجع به موارد مورد نیاز داریم canvas عنصری که Chart.js انتظار دارد:

1
<?php
2
/*
3
Template Name: Single Chart Page
4
*/
5
get_header();
6
?>
7

8
<main class="site-main">
9
    <?php
10
    if ( have_posts() ) :
11
        while ( have_posts() ) :
12
            the_post();
13
            ?>
14
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
15
                <div class="container my-5">
16
                    <canvas id="myChart"></canvas>
17
                </div>
18
            </article>
19
            <?php
20
        endwhile;
21
    endif;
22
    ?>
23
</main>
24

25
<?php
26
get_footer();

از آنجا، ما به سوئیچ functions.php فایل و یک تابع ایجاد کنید، که فقط برای صفحاتی که الگوی آنها است اجرا می شود صفحه نمودار واحد یک، برای تولید داده های نمودار در قالب مورد نظر:

1
function get_single_chart() {
2
    $chart_single  = (object) array(
3
        'legends' => (object) array(),
4
        'labels'  => array(),
5
        'bars'    => (object) array(
6
            'bar1' => array(),
7
            'bar2' => array(),
8
        ),
9
        'title'   => '',
10
    );
11
    $chart         = get_field( 'chart' );
12
    $chart_legends = $chart['legends'];
13

14
    $chart_single->title            = esc_html( $chart['title'] );
15
    $chart_single->legends->legend1 = esc_html( $chart_legends['legend1'] );
16
    $chart_single->legends->legend2 = esc_html( $chart_legends['legend2'] );
17
    
18
    foreach ( $chart['rows'] as $row ) :
19
        array_push( $chart_single->labels, esc_html( $row['label'] ) );
20
        array_push( $chart_single->bars->bar1, esc_html( $row['bar1'] ) );
21
        array_push( $chart_single->bars->bar2, esc_html( $row['bar2'] ) );
22
    endforeach;
23
    
24
    return $chart_single;
25
}

برای سادگی، از بررسی های اضافی مانند اطمینان از خالی نبودن آرایه ردیف ها و غیره صرفنظر می کنیم.

در اینجا نمونه ای از داده های تولید شده آورده شده است:

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

ما این داده ها را از طریق wp_localize_script() عملکرد با کمک global_obj به فایل جاوا اسکریپت مرتبط شیء کنید.

1
function playground_scripts_and_styles() {    
2
    ...
3
    if ( is_page_template( 'page-templates/single-chart.php' ) ) :
4
        wp_enqueue_script( 'playground-script-single-chart', $theme_uri . '/assets/js/single-chart.js', array(), null, true );
5
        wp_localize_script(
6
            'playground-script-single-chart',
7
            'global_obj',
8
            array(
9
                'chart' => get_single_chart(),
10
            )
11
        );
12
    endif;
13
}
14
add_action( 'wp_enqueue_scripts', 'playground_scripts_and_styles' );

بعد، در single-chart.js فایل، ما داده های PHP را با استفاده از global_obj.chart ویژگی و نمودار میله عمودی را با کد زیر چاپ کنید:

1
Chart.defaults.font.family = "Poppins, sans-serif";
2
Chart.defaults.color = "#073b4c";
3

4
const chart = global_obj.chart;
5

6
const data = {
7
  labels: chart.labels,
8
  مجموعه داده ها: [
9
    {
10
      label: chart.legends.legend1,
11
      data: chart.bars.bar1,
12
      backgroundColor: "#dc3545",
13
    },
14
    {
15
      label: chart.legends.legend2,
16
      data: chart.bars.bar2,
17
      backgroundColor: "#198754",
18
    },
19
  
20
};
21

22
const config = {
23
  type: "bar",
24
  data,
25
  options: {
26
    plugins: {
27
      title: {
28
        display: true,
29
        text: chart.title,
30
        position: "top",
31
        font: {
32
          size: 25,
33
        },
34
        padding: {
35
          top: 15,
36
          bottom: 15,
37
        },
38
      },
39
      legend: {
40
        position: "bottom",
41
        labels: {
42
          padding: 30,
43
          font: {
44
            size: 14,
45
          },
46
        },
47
      },
48
      tooltip: {
49
        enabled: false,
50
      },
51
    },
52
    scales: {
53
      y: {
54
        ticks: {
55
          crossAlign: "left",
56
          callback: function (val) {
57
            return `${val}%`;
58
          },
59
        },
60
      },
61
    },
62
  },
63
};
64

65
const ctx = document.getElementById("myChart").getContext("2d");
66
new Chart(ctx, config);

تب های بوت استرپ را با نمودارها ادغام کنید

حالا بیایید یک قدم جلوتر برویم و طرح بندی آموزش قبلی را دوباره ایجاد کنیم.

طرح بندی برگه هاطرح بندی برگه هاطرح بندی برگه ها

با استفاده از ACF، یک فیلد محتوای انعطاف‌پذیر جدید ایجاد می‌کنیم و آن را به صفحه‌ای که می‌خواهیم ترسیم می‌کنیم—در مورد من، این صفحه با صفحه برگه ها قالب.

فیلد محتوای انعطاف پذیر برگه هافیلد محتوای انعطاف پذیر برگه هافیلد محتوای انعطاف پذیر برگه ها

برای هر تب، دو فیلد تعریف می کنیم: نام آن و داده های نمودار تعبیه شده.

فیلدهای هر برگهفیلدهای هر برگهفیلدهای هر برگه

رشته های فرعی از چارت سازمانی فیلد گروه همان فیلدهای the است چارت سازمانی زمینه گروهی از صفحه نمودار واحد قالب.

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

ایجاد تب از طریق ادمینایجاد تب از طریق ادمینایجاد تب از طریق ادمین

هر تب به شکل زیر خواهد بود:

فیلدهای داخل هر برگهفیلدهای داخل هر برگهفیلدهای داخل هر برگه

در tabs.php فایل، ما از طریق زبانه ها حلقه می زنیم و برای هر کدام، مورد مناسب را ایجاد می کنیم canvas عنصری که Chart.js انتظار دارد:

1
<?php
2
/*
3
Template Name: Tabs Page
4
*/
5
get_header();
6
?>
7

8
<main class="site-main">
9
    <?php
10
    if ( have_posts() ) :
11
        while ( have_posts() ) :
12
            the_post();
13
            $tabs = get_field( 'tabs' );
14
            ?>
15
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
16
                <div class="container my-5">
17
                    <ul class="nav nav-tabs" id="myTab" role="tablist">
18
                        <?php
19
                        foreach ( $tabs as $key => $tab ) :
20
                            $active_class  = 0 === $key ? ' active' : '';
21
                            $aria_selected = 0 === $key ? true : false;
22
                            $number        = ++$key;
23
                            ?>
24
                            <li class="nav-item" role="presentation">
25
                                <button class="nav-link<?php echo $active_class; ?>" id="chart<?php echo $number; ?>-tab" data-bs-toggle="tab" data-bs-target="#chart<?php echo $number; ?>-tab-pane" type="button" role="tab" aria-controls="chart<?php echo $number; ?>-tab-pane" aria-selected="<?php echo $aria_selected; ?>">
26
                                    <?php echo esc_html( $tab['title'] ); ?>
27
                                </button>
28
                            </li>
29
                        <?php endforeach; ?>
30
                    </ul>
31
                    <div class="tab-content mt-5" id="myTabContent">
32
                        <?php
33
                        foreach ( $tabs as $key => $tab ) :
34
                            $active_class = 0 === $key ? ' show active' : '';
35
                            $number       = ++$key;
36
                            ?>
37
                            <div class="tab-pane fade<?php echo $active_class; ?>" id="chart<?php echo $number; ?>-tab-pane" role="tabpanel" aria-labelledby="chart<?php echo $number; ?>-tab" tabindex="0">
38
                                <canvas id="myChart<?php echo $number; ?>"></canvas>
39
                            </div>
40
                        <?php endforeach; ?>
41
                    </div>
42
                </div>
43
            </article>
44
            <?php
45
        endwhile;
46
    endif;
47
    ?>
48
</main>
49

50
<?php
51
get_footer();

از آنجا، ما به سوئیچ functions.php فایل و یک تابع ایجاد کنید، که فقط برای صفحاتی که الگوی آنها است اجرا می شود صفحه برگه ها یک، برای تولید داده های نمودار در قالب مورد نظر:

1
function get_multiple_charts() {
2
    $charts = array();
3
    $tabs   = get_field( 'tabs' );
4
    foreach ( $tabs as $tab ) :
5
        $chart_single  = (object) array(
6
            'legends' => (object) array(),
7
            'labels'  => array(),
8
            'bars'    => (object) array(
9
                'bar1' => array(),
10
                'bar2' => array(),
11
            ),
12
            'title'   => '',
13
        );
14
        $chart         = $tab['chart'];
15
        $chart_legends = $chart['legends'];
16
        
17
        $chart_single->title            = esc_html( $chart['title'] );
18
        $chart_single->legends->legend1 = esc_html( $chart_legends['legend1'] );
19
        $chart_single->legends->legend2 = esc_html( $chart_legends['legend2'] );
20
        
21
        foreach ( $chart['rows'] as $row ) :
22
            array_push( $chart_single->labels, esc_html( $row['label'] ) );
23
            array_push( $chart_single->bars->bar1, esc_html( $row['bar1'] ) );
24
            array_push( $chart_single->bars->bar2, esc_html( $row['bar2'] ) );
25
        endforeach;
26
        array_push( $charts, $chart_single );
27
    endforeach;
28
    
29
    return $charts;
30
}

باز هم، برای سادگی، از بررسی های اضافی مانند اطمینان از خالی نبودن آرایه ردیف ها و غیره صرف نظر می کنیم.

در اینجا نمونه ای از داده های تولید شده آورده شده است:

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

ما این داده ها را از طریق wp_localize_script() عملکرد با کمک global_obj به فایل جاوا اسکریپت مرتبط شیء کنید.

1
function playground_scripts_and_styles() {
2
    ...
3
    if ( is_page_template( 'page-templates/tabs.php' ) ) :
4
        wp_enqueue_script( 'playground-script-multiple-charts', $theme_uri . '/assets/js/multiple-charts.js', array(), null, true );
5
        wp_localize_script(
6
            'playground-script-multiple-charts',
7
            'global_obj',
8
            array(
9
                'charts' => get_multiple_charts(),
10
            )
11
        );
12
    endif;
13
}
14
add_action( 'wp_enqueue_scripts', 'playground_scripts_and_styles' );

بعد، در multiple-charts.js فایل، ما داده های PHP را با استفاده از global_obj.charts ویژگی و نمودارهای نوار عمودی را با همان کدی که در آموزش قبلی استفاده کردیم چاپ کنید.

1
const tabEls = document.querySelectorAll('button[data-bs-toggle="tab"]');
2

3
Chart.defaults.font.family = "Poppins, sans-serif";
4
Chart.defaults.color = "#073b4c";
5

6
initializeSingleChart(0);
7

8
tabEls.forEach(function (tabEl) {
9
  tabEl.addEventListener("shown.bs.tab", function (event) {
10
    const index = Array.from(tabEls).indexOf(event.target);
11
    initializeSingleChart(index);
12
  });
13
});
14

15
function initializeSingleChart(index) {
16
  const chart = global_obj.charts[index];
17
  const chartEl = `myChart${++index}`;
18
  const chartInstance = Chart.getChart(chartEl);
19
  
20
  if (chartInstance !== undefined) {
21
    chartInstance.destroy();
22
  }
23

24
  const data = {
25
    labels: chart.labels,
26
    مجموعه داده ها: [
27
      {
28
        label: chart.legends.legend1,
29
        data: chart.bars.bar1,
30
        backgroundColor: "#dc3545"
31
      },
32
      {
33
        label: chart.legends.legend2,
34
        data: chart.bars.bar2,
35
        backgroundColor: "#198754"
36
      }
37
    ]
38
  };
39

40
  const config = {
41
    type: "bar",
42
    data,
43
    options: {
44
      plugins: {
45
        title: {
46
          display: true,
47
          text: chart.title,
48
          position: "top",
49
          font: {
50
            size: 25
51
          },
52
          padding: {
53
            top: 15,
54
            bottom: 15
55
          }
56
        },
57
        legend: {
58
          position: "bottom",
59
          labels: {
60
            padding: 30,
61
            font: {
62
              size: 14
63
            }
64
          }
65
        },
66
        tooltip: {
67
          enabled: false
68
        }
69
      },
70
      scales: {
71
        y: {
72
          ticks: {
73
            crossAlign: "left",
74
            callback: function (val) {
75
              return `${val}%`;
76
            }
77
          }
78
        }
79
      }
80
    }
81
  };
82

83
  const ctx = document.getElementById(chartEl).getContext("2d");
84
  new Chart(ctx, config);
85
}

نتیجه

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

البته، در اینجا ما با فریم ورک بوت استرپ و افزونه ACF کار کردیم، اما روش بدون توجه به فریمورک front-end/CSS یا افزونه فیلدهایی که قرار است استفاده کنید، یکسان باقی می‌ماند.

مثل همیشه، خیلی ممنون که خواندید!