Advertisement
  1. Code
  2. WordPress

Dinamikus Oldalsablonok WordPress-ben, 2. rész

Scroll to top
Read Time: 13 min
This post is part of a series called Dynamic Page Templates in WordPress.
Dynamic Page Templates in WordPress, Part 1
Dynamic Page Templates in WordPress, Part 3

Hungarian (Magyar) translation by Viktor Istvan Csaszar (you can also view the original English article)

Ennek az oktatósorozatnak az első részében bemutattam a dinamikus oldalsablonok alapkoncepcióját, és létrehoztam egy általános oldalsablont a jövőbeni munkához történő felhasználásra. A Twenty Seventeen szülősablonon alapuló WordPress gyermeksablont használtam az oldalsablon implementálásához.

Ebben az oktatóbejegyzésben további specifikus részleteket tudhatsz meg a dinamikus oldalsablonokról, illetve,hogy hogyan használd fel őket a saját WordPress projektjeidben.

Azt is lépésről-lépésre bemutatom, hogyan terjeszd ki az oldalsablont a kezdeti lépésektől, míg létrehozod a saját első, működő dinamikus oldalsablonod!

Dinamikus oldalsablonok: Egy rugalmasabb megközelítés

Nos, hogyan is tehetjük az oldalsablonokat még rugalmasabbá, s miért is hasznos ez egyébként?

Tegyük fel, hogy van egy portfólió oldalsablonokd, mely galériát hoz létre, benne a portfolói elemek sokaságával. Mindegyik elem meghatározott mérettel rendelkezne, s így csak megadott mennyiség férne közülük mindegyik sorba.

Természetesen hozzáadhatnánk egy másik oldalsablont, hogy a portfóliókat különböző méretben is mutassuk. De mi van akkor, ha mi kicsi, közepes és nagy méretű portfóliókat is mutatnánk? Ehhez, három különálló oldalsablonra lenne szükség, mindegyikük különböző méretben mutatná a portfólió elemeket.

Egy azonnali megoldással viszont sokkal rugalmasabbá tehetnénk ezt, egy legördülő menü hozzáadásával, ahol kiválasztható lenne a portfólió mérete (pl. kicsi, közepes vagy nagy). Ez kényelmesebb lenne a felhasználó számára is, mivel az oldalsablon doboz kevésbé lenne zsúfolt a szükségtelen választási lehetőségekkel.

Nem beszélve arról, hogy a fejlesztőnek is csak egy oldalsablont kellene karban tartania, a korábbi három helyett! Ez megfelelne a Ne ismételd önmagad (Don't Repeat Yourself - DRY) szoftverfejlesztési alapelvnek.

Az összes oldalsablonnak dinamikusnak kell lennie?

Érdemes megjegyezni, hogy nem minden oldalsablon számára előnyös, ha dinamikus. Ha egy olyan oldalsablonnal rendelkezel, mely csupán egyetlen dolgot csinál, s csupán azt az egyet, akkor nem szükséges dinamikusnak lennie. Ebben az esetben nem lenne értelme további egyedi vezérlést és extra dolgokat addni ehhez a sablonhoz.

Ahogy te is látni fogod ennek az oktató bejegyzésnek a végére, számos oldalsablon nagyszerű előnyöket szerezhet, ha sokkal rugalmasabban működik.

Egy másik hasznos példa a dinamikus oldalsablonokhoz a kapcsolatfelvételi űrlap. Nagyon sok egyedi vezérlőelem adható az ilyen oldalsablonhoz, hogy nagymértékben rugalmassá váljon.

Például, ahelyett, hogy a kimeneten az űrlapmezők egy meghatározott sorrendje jelenjen meg, az oldalsablon vezérlőelemei egy teljesen testre szabható mezősorrendet tehetnek lehetővé. Vagy esetleg a captcha mező alkalmanként megjelenítésre kerülthet, így elkerülve a spam beküldéseket. Hihetelen sok mód van egy kapcsolatfelvételi űrlap személyre szabására!

Egy dinamikus oldalsablont fogok elkészíteni ennek az oktatósorozatnak a 3. részében. De előbb, kezdjük a munkát egy általános célú dinamikus oldalsablon létrehozásával!

Az első dinamikus oldalsablonunk

Kezdésnek, létre fogunk hozni egy alap dinamikus oldalsablont, mellyel megmutatjuk, mennyire együtt tudnak működni egymással a különféle összetevők. Egyedi vezérlők kerülnek hozzáadásra az oldalszerkesztőhöz, melyek később felhasználásra kerülnek az oldalsablon kimenetének kialakításához.

Az egyedi oldalsablon vezérlő elemek, melyeket hamarosan hozzá fogunk adni:

  • Szövegmező
  • Szövegdoboz
  • Jelölődoboz
  • Rádiógombok
  • Legördülő jelölődoboz

Ideális esetben ezeket a vezérlőelemeket közvetlenül az oldalsablon legördülő doboza alá kell elhelyezni, ezzel egyértelmű lesz, hogy az oldalsablonhoz tartoznak.

Habár, a WordPress nem biztosít ehhez egyetlen hookot sem, így neked (most) ezt úgy kell megoldanod, hogy az egyedi oldalsablon vezérlőket egy elkülönített egyedi meta dobozhoz adod. Ennek az oktatósorozatnak a harmadik részében majd megmutatom, hogy kerekedj felül ezen a problémán is.

A hookok alapvetően a WordPress fejlesztéshez. Lehetővé teszik a fejlesztők számára a kódkészlet olyan kiterjesztését, ahol nem szükséges a rendszermag fájljainak szerkesztése, amely amúgy is rossz ötlet lenne. Főleg azért, mert minden egyedi kódot kisöpörne egy következő WordPress frissítés (amely nagyon gyakran kiadásra kerül).

A meta dobozunk megjelenítéséhez az oldalszerkesztő felületen, add hozzá a load-post.php és load-post-new.php hookokat a gyermeksablon init() metódusához, amit az 1. részben hoztunk létre.

1
<?php
2
add_action( 'load-post.php', array( $this, 'page_template_meta_box' ) );
3
add_action( 'load-post-new.php', array( $this, 'page_template_meta_box' ) );
4
add_action( 'save_post', 'save_page_template_meta', 10, 2 );
5
}

Két WordPress hookot használunk, hogy biztosítsuk a meta dobozok megjelenítését az oldalszerkesztőben, hozz létre akár egy új oldalt, vagy szerkessz egy már meglévőt. Ott van még a save_post hook is, mely kezeli a post meta adatok mentését, s mellyel egy kicsit később foglalkozunk majd.

Add hozzá a következő négy class metódust az adatok létrehozásához, megjelenítéséhez és mentéséhez a meta dobozokhoz.

1
/* Add meta box hook. */
2
public function page_template_meta_box() {
3
  add_action( 'add_meta_boxes', array( $this, 'add_page_template_meta_box' ) );
4
}
1
/* Register meta box. */
2
public function add_page_template_meta_box() {
3
  add_meta_box(
4
    'page-template-meta-box',
5
  esc_html__( 'Page Template Meta Box', 'twenty-seventeen-child' ),
6
	array( $this, 'display_page_template_meta_box' ),
7
	'page',
8
	'side',
9
	'default'
10
  );
11
}
1
/* Render meta box on the page editor. */
2
public function display_page_template_meta_box($object) {  
3
  wp_nonce_field( basename( __FILE__ ), 'page_template_meta_box_nonce' );
4
}

Nem fogom itt túl mélyen részletezni a WordPress meta dobozokat, mely önmagában is egy önálló oktatóbejegyzés lehetne, de megjegyezném a következőket a fentebb általam hozzáadott kódról:

  • A page_template_meta_box() és az add_page_template_meta_box() class metódusok regisztálják a meta dobozt a WordPress-ben.
  • Az add_page_template_meta_box() esetén a 'page' paraméter határozza meg, hogy ez a meta doboz csak a 'page" poszt típus szerkesztőjében jelenjen meg a WordPress adminban.
  • A display_page_template_meta_box() class metódus hozza létre a meta dobozt, és beállít egy nonce-t az űrlapvezérlők még biztonságosabbá tételére.

Ha minden rendben ment, akkor már látnod kell a megjelent meta dobozt az oldal szerkesztőben, ahogy alább látszik.

A new page meta boxA new page meta boxA new page meta box

Jelenleg még egy picit üres, szóval, adjunk hozzá néhány vezérlőt!

Egyedi vezérlők hozzáadása

Ha még emlékezel a fentiekből, akkor hozzáadunk egy szövegmezőt, szövegdobozt, rádiógombot és dobozválasztó vezérlőket a meta dobozhoz. Kezdjük a következő kód hozzáadásával a display_page_template_meta_box() metódushoz, a nonce függvény alatt.

1
<?php
2
$text = get_post_meta( $object->ID, 'page_template_text', true );
3
$textarea = get_post_meta( $object->ID, 'page_template_textarea', true );
4
$checkbox = get_post_meta( $object->ID, 'page_template_chk', true );
5
$radio = get_post_meta( $object->ID, 'page_template_radio', true );
6
$select = get_post_meta( $object->ID, 'page_template_select', true );

Ez veszi a meta doboz vezérlőink aktuális értékeit, s eltárolja őket helyi változókként. Most addjuk hozzá a következő HTML kódot közvetlenül utána, hogy legeneráljuk a meta doboz vezérlőket.

1
  ?>
2
  <div>
3
	<p>
4
	    <label for="page-template-text"><?php _e( "Text Control", 'twenty-seventeen-child' ); ?></label><br>
5
	    <input class="widefat" type="text" name="page-template-text" id="page-template-text" value="<?php echo esc_attr( $text ); ?>" />
6
	</p>
7
8
	<p>
9
	    <label for="page-template-textarea"><?php _e( "Textarea Control", 'twenty-seventeen-child' ); ?></label><br>
10
	    <textarea rows="5" class="widefat" name="page-template-textarea" id="page-template-textarea"><?php echo esc_attr( $textarea ); ?></textarea>
11
	</p>
12
13
	<p>
14
	    <input type="checkbox" name="page-template-chk" id="page-template-chk" value="1" <?php checked($checkbox, true); ?> />&nbsp;<label for="page-template-chk"><?php _e( "Checkbox Control", 'twenty-seventeen-child' ); ?></label><br>
15
	</p>
16
17
	<p>
18
	    <label for="page-template-align"><?php _e( "Radio Button Control", 'twenty-seventeen-child' ); ?></label><br>
19
	    <input type="radio" name="page-template-align" id="rdo-left" value="left" <?php checked( $radio, 'left' ); ?> ><label for="rdo-left"><?php _e( 'Left', 'twenty-seventeen-child' ); ?></label><br>
20
	    <input type="radio" name="page-template-align" id="rdo-right" value="right" <?php checked( $radio, 'right' ); ?> ><label for="rdo-right"><?php _e( 'Right', 'twenty-seventeen-child' ); ?></label><br>
21
	    <input type="radio" name="page-template-align" id="rdo-center" value="center" <?php checked( $radio, 'center' ); ?> ><label for="rdo-center"><?php _e( 'Center', 'twenty-seventeen-child' ); ?></label><br>
22
	</p>
23
24
	<p>
25
	    <label for="page-template-select">Dropdown</label>
26
	    <select name="page-template-select" class="widefat">
27
		    <option	value='one' <?php selected( 'one', $select ); ?>><?php _e( 'One', 'twenty-seventeen-child' ); ?></option>
28
		    <option	value='two' <?php selected( 'two', $select ); ?>><?php _e( 'Two', 'twenty-seventeen-child' ); ?></option>
29
		    <option	value='three' <?php selected( 'three', $select ); ?>><?php _e( 'Three', 'twenty-seventeen-child' ); ?></option>
30
		    <option	value='four' <?php selected( 'four', $select ); ?>><?php _e( 'Four', 'twenty-seventeen-child' ); ?></option>
31
	    </select>
32
	</p>
33
</div><?php

Mindegyik vezérlő egy bekezdés elemet tartalmazott magában, s az aktuális értéke frissítésre került a korábban létrehozott helyi változókkal. Ez biztosítja, hogy a meta doboz vezérlők mindig a megfelelő értékeket jelenítik meg.

Habár, ez az egész nem fog megtörténni, hacsak nem mentjük a jelenlegi meta doboz vezérlői adatait a WordPress adatbázisába.

Kicsit korábban, regisztráltam egy hookot, hogy végrehajtson egy class metódust minden alkalommal, amikor az oldal szerkesztő frissítésre került. Adjuk hozzá hát ezt a metódust a gyermeksablon classunkhoz most!

1
<?php
2
/* Save meta box data. */
3
public function save_page_template_meta( $post_id, $post ) {
4
5
    if ( ! ( isset( $_POST[ 'page_template_meta_box_nonce' ] ) && wp_verify_nonce( $_POST[ 'page_template_meta_box_nonce' ], basename( __FILE__ ) ) ) ) {
6
	    return $post_id;
7
    }
8
9
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
10
        return $post_id;
11
    }
12
13
    if( 'page' != $post->post_type ) {
14
	    return $post_id;
15
    }
16
17
    $page_template_text_value = isset( $_POST[ 'page-template-text' ] ) ? $_POST[ 'page-template-text' ] : '';
18
    update_post_meta( $post_id, 'page_template_text', $page_template_text_value );
19
20
    $page_template_textarea_value = isset( $_POST[ 'page-template-textarea' ] ) ? $_POST[ 'page-template-textarea' ] : '';
21
    update_post_meta( $post_id, 'page_template_textarea', $page_template_textarea_value );
22
23
    $page_template_chk_value = isset( $_POST[ 'page-template-chk' ] ) ? $_POST[ 'page-template-chk' ] : '';
24
    update_post_meta( $post_id, 'page_template_chk', $page_template_chk_value );
25
26
    $page_template_radio_value = isset( $_POST[ 'page-template-align' ] ) ? $_POST[ 'page-template-align' ] : '';
27
    update_post_meta( $post_id, 'page_template_radio', $page_template_radio_value );
28
29
    $page_template_select_value = isset( $_POST[ 'page-template-select' ]) ? $_POST[ 'page-template-select' ] : '';
30
    update_post_meta( $post_id, 'page_template_select', $page_template_select_value );
31
}

A save_page_template_meta() class metódus kezeli a meta doboz vezérlői adatainak mentését. Csak akkor menti a meta doboz adatait, ha a nonce megerősítésre kerül, a jelenlegi felhasználó szerkesztheti a posztokat, és az oldal szerkesztő admin felületén vagyunk.

Ha ezen a feltételek fennállnak, akkor mindegyik vezérlő adatát kinyerjük a globális $_POST változóból. Ez a változó minden alkalommal beállításra kerül, amikor egy űrlapot elküldenek.

Végül, a meta doboz vezérlő adatai elmentésre kerülnek a WordPress adatbázisába, mint az aktuális oldal meta adatai.

A hozzáadott egyedi oldalsablon vezérlőkkel, a meta dobozunknak így kell kinéznie.

Adding controls to the meta boxAdding controls to the meta boxAdding controls to the meta box

Írj be valamilyen szöveget a szövegmezőbe és a szövegdobozba, jelölj ki valamit a jelölődobozban, a rádiógombnál és a kiválasztó dobozban. Nyomd meg a gombot a változtatásaid elmentéséhez, s amikor az oldal szerkesztő befrissül, a meta doboz vezérlőidnek azt kell mutatniuk, amit épp beállítottál.

Populating the meta boxPopulating the meta boxPopulating the meta box

A gyermeksablon functions.php fájljának teljes forráskódja alább látható.

1
<?php
2
3
/**

4
 * Twenty Seventeen child theme class.

5
 *

6
 * DPT = D[ynamic] P[age] T[emplates].

7
 */
8
class DPT_Twenty_Seventeen_Child {
9
10
    /**

11
	 * Register hooks.

12
	 */
13
	public function init() {
14
		add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_parent_theme_styles' ) );
15
		add_action( 'load-post.php', array( $this, 'page_template_meta_box' ) );
16
		add_action( 'load-post-new.php', array( $this, 'page_template_meta_box' ) );
17
		add_action( 'save_post', array( $this, 'save_page_template_meta' ), 10, 2 );
18
	}
19
20
	/* Enqueue parent theme styles. */
21
	public function enqueue_parent_theme_styles() {
22
		wp_enqueue_style( 'twenty-seventeen-css', get_template_directory_uri() . '/style.css' );
23
	}
24
25
	/* Add meta box hook. */
26
	public function page_template_meta_box() {
27
	  add_action( 'add_meta_boxes', array( $this, 'add_page_template_meta_box' ) );
28
	}
29
30
	/* Register meta box. */
31
	public function add_page_template_meta_box() {
32
	  add_meta_box(
33
		'page-template-meta-box',
34
		esc_html__( 'Page Template Meta Box', 'twenty-seventeen-child' ),
35
		array( $this, 'display_page_template_meta_box' ),
36
		'page',
37
		'side',
38
		'default'
39
	  );
40
	}
41
42
	/* Render meta box on the page editor. */
43
	public function display_page_template_meta_box( $object ) {
44
45
	  wp_nonce_field( basename( __FILE__ ), 'page_template_meta_box_nonce' );
46
47
	  $text = get_post_meta( $object->ID, 'page_template_text', true );
48
	  $textarea = get_post_meta( $object->ID, 'page_template_textarea', true );
49
      $checkbox = get_post_meta( $object->ID, 'page_template_chk', true );
50
      $radio = get_post_meta( $object->ID, 'page_template_radio', true );
51
      $select = get_post_meta( $object->ID, 'page_template_select', true );
52
	  ?>
53
	  <div>
54
		<p>
55
			<label for="page-template-text"><?php _e( "Text Control", 'twenty-seventeen-child' ); ?></label><br>
56
			<input class="widefat" type="text" name="page-template-text" id="page-template-text" value="<?php echo esc_attr( $text ); ?>" />
57
		</p>
58
59
		<p>
60
			<label for="page-template-textarea"><?php _e( "Textarea Control", 'twenty-seventeen-child' ); ?></label><br>
61
			<textarea rows="5" class="widefat" name="page-template-textarea" id="page-template-textarea"><?php echo esc_attr( $textarea ); ?></textarea>
62
		</p>
63
64
		<p>
65
			<input type="checkbox" name="page-template-chk" id="page-template-chk" value="1" <?php checked($checkbox, true); ?> />&nbsp;<label for="page-template-chk"><?php _e( "Checkbox Control", 'twenty-seventeen-child' ); ?></label><br>
66
		</p>
67
68
		<p>
69
			<label for="page-template-align"><?php _e( "Radio Button Control", 'twenty-seventeen-child' ); ?></label><br>
70
			<input type="radio" name="page-template-align" id="rdo-left" value="left" <?php checked( $radio, 'left' ); ?> ><label for="rdo-left"><?php _e( 'Left', 'twenty-seventeen-child' ); ?></label><br>
71
			<input type="radio" name="page-template-align" id="rdo-right" value="right" <?php checked( $radio, 'right' ); ?> ><label for="rdo-right"><?php _e( 'Right', 'twenty-seventeen-child' ); ?></label><br>
72
			<input type="radio" name="page-template-align" id="rdo-center" value="center" <?php checked( $radio, 'center' ); ?> ><label for="rdo-center"><?php _e( 'Center', 'twenty-seventeen-child' ); ?></label><br>
73
		</p>
74
75
		<p>
76
			<label for="page-template-select">Dropdown</label>
77
			<select name="page-template-select" class="widefat">
78
				<option	value='one' <?php selected( 'one', $select ); ?>><?php _e( 'One', 'twenty-seventeen-child' ); ?></option>
79
				<option	value='two' <?php selected( 'two', $select ); ?>><?php _e( 'Two', 'twenty-seventeen-child' ); ?></option>
80
				<option	value='three' <?php selected( 'three', $select ); ?>><?php _e( 'Three', 'twenty-seventeen-child' ); ?></option>
81
				<option	value='four' <?php selected( 'four', $select ); ?>><?php _e( 'Four', 'twenty-seventeen-child' ); ?></option>
82
			</select>
83
		</p>
84
	  </div><?php
85
	}
86
87
	/* Save meta box data. */
88
	public function save_page_template_meta( $post_id, $post ) {
89
90
	  if ( ! ( isset( $_POST[ 'page_template_meta_box_nonce' ] ) && wp_verify_nonce( $_POST[ 'page_template_meta_box_nonce' ], basename( __FILE__ ) ) ) ) {
91
		return $post_id;
92
	  }
93
94
	  if ( ! current_user_can( 'edit_post', $post_id ) ) {
95
		return $post_id;
96
	  }
97
98
	  if( 'page' != $post->post_type ) {
99
		return $post_id;
100
	  }
101
102
	  $page_template_text_value = isset( $_POST[ 'page-template-text' ] ) ? $_POST[ 'page-template-text' ] : '';
103
	  update_post_meta( $post_id, 'page_template_text', $page_template_text_value );
104
105
  	  $page_template_textarea_value = isset( $_POST[ 'page-template-textarea' ] ) ? $_POST[ 'page-template-textarea' ] : '';
106
	  update_post_meta( $post_id, 'page_template_textarea', $page_template_textarea_value );
107
108
  	  $page_template_chk_value = isset( $_POST[ 'page-template-chk' ] ) ? $_POST[ 'page-template-chk' ] : '';
109
	  update_post_meta( $post_id, 'page_template_chk', $page_template_chk_value );
110
111
   	  $page_template_radio_value = isset( $_POST[ 'page-template-align' ] ) ? $_POST[ 'page-template-align' ] : '';
112
	  update_post_meta( $post_id, 'page_template_radio', $page_template_radio_value );
113
114
   	  $page_template_select_value = isset( $_POST[ 'page-template-select' ]) ? $_POST[ 'page-template-select' ] : '';
115
	  update_post_meta( $post_id, 'page_template_select', $page_template_select_value );
116
	}
117
}
118
119
$ts_child_theme = new DPT_Twenty_Seventeen_Child();
120
$ts_child_theme->init();

A kirakós utolsó darabjaként használjuk a meta doboz vezérlő adatait az oldalsablonunkban, a front enden. Nyisd meg a test-page-template.php fájlt, melyet az 1. részben csináltunk, s cseréld ki a tartalmát ezzel a frissített kóddal:

1
<?php
2
/**

3
 * Template Name: Test Page Template

4
 *

5
 * @package WordPress

6
 * @subpackage Twenty_Seventeen

7
 * @since 1.0

8
 */
9
10
get_header(); ?>
11
12
<div class="wrap">
13
    <div id="primary" class="content-area">
14
		<main id="main" class="site-main" role="main">
15
16
			<?php
17
			while ( have_posts() ) : the_post();
18
19
				$text = get_post_meta( get_the_ID(), 'page_template_text', true );
20
				$textarea = get_post_meta( get_the_ID(), 'page_template_textarea', true );
21
				$checkbox = get_post_meta( get_the_ID(), 'page_template_chk', true );
22
				$radio = get_post_meta( get_the_ID(), 'page_template_radio', true );
23
				$select = get_post_meta( get_the_ID(), 'page_template_select', true );
24
25
				echo "<p>Text Box: " . $text . "</p>";
26
				echo "<p>Text Area: " . $textarea . "</p>";
27
				echo "<p>Checkbox: " . $checkbox . "</p>";
28
				echo "<p>Radio Buttons: " . $radio . "</p>";
29
				echo "<p>Dropdown: " . $select . "</p>";
30
31
				echo "<h2>Sitemap</h2>";
32
				echo "<ul>" . wp_list_pages( array( 'title_li' => '' ) ) . "</ul>";
33
34
			endwhile; // End of the loop.

35
			?>
36
37
		</main><!-- #main -->
38
	</div><!-- #primary -->
39
</div><!-- .wrap -->
40
41
<?php get_footer();

Győződj meg arról, hogy a 'Test Page Template' az aktuálisan kiválasztott oldalsablon, s nézd meg az oldalt a front enden.

Viewing the output of the meta boxViewing the output of the meta boxViewing the output of the meta box

Ahogy láthatod, az oldalsablon most már tartalmazza azokat az adatokat, melyet nemrég állítottál be a meta doboz vezérlőinél az oldalszerkesztőben. Ez az alapja az oktatósorozat további részének, mivel ebből az alap példából fogunk építkezni, s számos változatát fogjuk létrehozni a teljesen működőképes dinamikus oldalsablonnak, melyeket felhasználhatsz majd a saját WordPress projektjeidben.

Konklúzió

Ebben az oktatóbejegyzésben bemutattuk, hogyan építs fel egy működő dinamikus oldalsablont. Jelenleg, habár tényleg működik, az alap oldalsablonunk nem nagyon hasznos.

A harmadik, s egyben utolsó részében ennek az oktatósorozatnak megmutatom, hogyan építs fel számos dinamikus oldalsablont, a kezdettől a befejezésig, melyet felhasználhatsz (s akár tovább is feljeszthetsz) a saját WordPress projektjeidben.

Ha bármilyen kérdésed lenne, kérlek, hagyj egy üzenetet alább a hozzászólásoknál. Kíváncsi vagyok az oktatóbejegyzéshez fűzött véleményedre!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.