헤더부분의 기본적인 작업을 마치고 본격적인 콘텐츠 부분의 레이아웃 작업에 들어가기 전에 우선 임시 데이터를 입력합니다. 뭐라도 내용이 있어야 디자인 작업을 할 때 모양이 그럴듯하게 나오기 때문입니다. 내용없이 텅텅 빈 홈페이지 만큼 없어 보이는 것도 없으니까요.
이런 임시 내용을 "더미 데이타(Dummy Data)"라고도 하고 워드프레스 플러그인으로도 개발되어 있습니다만 여기서는 그냥 입력하도록 하겠습니다. 대신 한글 "lorem ipsum"을 사용하여 글 내용은 입력하는 편이 수월하겠군요.
(lorem ipsum : 테스트용으로 쓰이는 더미 텍스트. 디자인을 할 때, 레이아웃을 테스트할 때, 프린트 테스트, 기계 테스트, 폰트 테스트, 컨텐츠의 양을 측정할 때 등에 사용됩니다.)

한글 lorem ipsum
http://guny.kr/stuff/klorem/

위의 사이트를 통해 무작위 텍스트를 만들어서 페이지 3개, 글 6개를 작성합니다. 특성이미지는 아직 넣을 수 없습니다.

 

이 콘텐츠를 기반으로 메뉴를 작성합니다.
관리자에서 외모 - 메뉴 로 이동하여, 아래와 같은 2단계 깊이의 메뉴를 만들고 메뉴명을 Menu 1 로 저장합니다.

 

블로그 이미지

환타73

디지털 콘텐츠 제작 및 연구 & 개발. 온오프라인 강의.

,

부트스트랩 레이아웃을 위해 원래의 요소에 클래스를 추가해보도록 하겠습니다.

먼저 테마 에디터에서 header.php를 선택하여 엽니다. 내용중 body 요소 아래쪽을 수정하여 부트스트랩을 적용해 보겠습니다.

header.php

<div id="page" class="hfeed site">

	<header id="masthead" class="site-header" role="banner">
		<div class="site-branding">
			<h1 class="site-title"><a href="<?php echo esc_url( home_url( '⁄' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?><⁄a><⁄h1>
			<h2 class="site-description"><?php bloginfo( 'description' ); ?><⁄h2>
		<⁄div>

		<nav id="site-navigation" class="main-navigation" role="navigation">
			<h1 class="menu-toggle"><?php _e( 'Menu', 'aca' ); ?><⁄h1>
			<a class="skip-link screen-reader-text" href="#content"><?php _e( 'Skip to content', 'aca' ); ?><⁄a>

			<?php wp_nav_menu( array( 'theme_location' => 'primary' ) ); ?>
		<⁄nav><!-- #site-navigation -->
	<⁄header><!-- #masthead -->

	<div id="content" class="site-content">

 

이제 여기에 클래스 요소를 추가해야 합니다. 우선 맨 위의 id가 page 인 div 요소가 있는데 이것이 홈페이지 전체를 감싸고 있는 요소 입니다. 여기 클래스에 "container"를 추가합니다.

그리고 아래쪽에 보면 id가 masthead 인 header 요소가 있습니다. header 요소는 사이트명, 사이트 설명, 네비게이션을 포함하고 있는 하나의 가로'행'을 구성하고 있습니다. 그렇기 때문에 클래스명에 "row"를 추가합니다.

header 요소 내부에 있는 div 요소는 사이트명, 사이트 설명을 포함하고 있으며 부트스트렙 레이아웃의 12행을 모두 포함합니다. 그래서 클래스명 site-branding 뒤에 "span12"를 추가합니다.

nav 요소는 메인 네비게이션으로 이 역시 12행을 모두 포함합니다. 클래스명 main-navigation 뒤에 "span12"를 추가합니다.

그리고 마지막 행의 id가 content인 div 요소는 헤더 아래쪽에서 푸터 위까지의 메인 콘텐츠 부분을 감싸고 있으므로 클래스명 site-content 뒤에 "row"를 추가합니다.

<div id="page" class="hfeed site container">
 
    <header id="masthead" class="site-header row" role="banner">
        <div class="site-branding span12">
            <h1 class="site-title"><a href="<?php echo esc_url( home_url( '⁄' ) ); ?>" rel="home"><?php bloginfo( 'name' ); ?><⁄a><⁄h1>
            <h2 class="site-description"><?php bloginfo( 'description' ); ?><⁄h2>
        <⁄div><!-- .site-branding .span12 -->
 
        <nav id="site-navigation" class="main-navigation span12" role="navigation">
            <h1 class="menu-toggle"><?php _e( 'Menu', 'aca' ); ?><⁄h1>
            <a class="skip-link screen-reader-text" href="#content"><?php _e( 'Skip to content', 'aca' ); ?><⁄a>
 
            <?php wp_nav_menu( array( 'theme_location' => 'primary' ) ); ?>
        <⁄nav><!-- #site-navigation .span12 -->
    <⁄header><!-- #masthead .row -->
 
    <div id="content" class="site-content row">

 

헤더의 레이아웃을 간단히 아래의 그림으로 표현할 수 있습니다.

 

헤더의 레이아웃은 잡아놓았지만 아직 네비게이션 부분의 셋팅이 남아있습니다. 부트스트랩은 고유의 반응형 네비게이션 바를 제공하고 있으며 화면의 가로 사이즈에 따라 모양이 변합니다.
부트스트랩 네비게이션 바를 사용하기 위해서는 우선 "header.php" nav 요소 부분을 아래와 같이 수정합니다.

<nav id="access" class="navbar span12" role="navigation">
			<div class="navbar">
				<div class="navbar-inner">
				<!-- 화면폭 줄어들면 메뉴 사라지고 토글버튼 생김-->
					<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
					<span class="icon-bar"><⁄span>
					<span class="icon-bar"><⁄span>
					<span class="icon-bar"><⁄span>
					<⁄a>
					<div class="nav-collapse">
						<!-- 네비게이션 메뉴 시작 -->
						<?php wp_nav_menu( array( 'theme_location' => 'primary', 'walker' => new bootstrapwp_walker_nav_menu(), 'menu' => 'main-menu', 'menu_class' => 'nav', 'menu_id' => 'main-menu' ) ); ?>
						<!-- 네비게이션 메뉴 끝 -->
					<⁄div><!--.nav-collapse-->
				<⁄div><!--.navbar-inner-->
			<⁄div><!-- .navbar -->
		<⁄nav><!-- #access .navbar .span12-->

 

그리고 "functions.php" 파일을 열어 내용 가장 아래에 다음의 코드를 추가해 넣습니다. 이 코드는 워드프레스의 메뉴를 부트스트랩 메뉴로 변환시키는 (부트스트랩의 네비게이션 바를 워드프레스 _S 테마의 기본 메뉴 출력에 적용시키는) 함수입니다.

⁄* 
 * 부트스트랩 메뉴화
 *⁄

function register_my_menus() {
	register_nav_menus(
		array(
			'header-menu' => __('Header Menu'),
			'extra-menu' => __('Extra Menu')
			)
		);
}
add_action('init', 'register_my_menus');
add_theme_support('menus');

⁄⁄

class bootstrapwp_walker_nav_menu extends Walker_Nav_Menu {


  function start_lvl( &$output, $depth ) {

    ⁄⁄In a child UL, add the 'dropdown-menu' class
    $indent = str_repeat( "\t", $depth );
    $output    .= "\n$indent<ul class=\"dropdown-menu\">\n";

  }

  function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {

    $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

    $li_attributes = '';
    $class_names = $value = '';

    $classes = empty( $item->classes ) ? array() : (array) $item->classes;

    ⁄⁄Add class and attribute to LI element that contains a submenu UL.
    if ($args->has_children){
      $classes[]    = 'dropdown';
      $li_attributes .= 'data-dropdown="dropdown"';
    }
    $classes[] = 'menu-item-' . $item->ID;
    ⁄⁄If we are on the current page, add the active class to that menu item.
    $classes[] = ($item->current) ? 'active' : '';

    ⁄⁄Make sure you still add all of the WordPress classes.
    $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
    $class_names = ' class="' . esc_attr( $class_names ) . '"';

    $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
    $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';

    $output .= $indent . '<li' . $id . $value . $class_names . $li_attributes . '>';

    ⁄⁄Add attributes to link element.
    $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
    $attributes .= ! empty( $item->target ) ? ' target="' . esc_attr( $item->target     ) .'"' : '';
    $attributes .= ! empty( $item->xfn ) ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
    $attributes .= ! empty( $item->url ) ? ' href="'   . esc_attr( $item->url        ) .'"' : '';
    $attributes .= ($args->has_children) ? ' class="dropdown-toggle" data-toggle="dropdown"' : ''; 

    $item_output = $args->before;
    $item_output .= '<a'. $attributes .'>';
    $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
    $item_output .= ($args->has_children) ? ' <b class="caret"><⁄b> ' : ''; 
    $item_output .= '<⁄a>';
    $item_output .= $args->after;

    $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
  }

  ⁄⁄Overwrite display_element function to add has_children attribute. Not needed in >= Wordpress 3.4
  function display_element( $element, &$children_elements, $max_depth, $depth=0, $args, &$output ) {

    if ( !$element )
      return;

    $id_field = $this->db_fields['id'];

    ⁄⁄display this element
    if ( is_array( $args[0] ) ) 
      $args[0]['has_children'] = ! empty( $children_elements[$element->$id_field] );
    else if ( is_object( $args[0] ) ) 
      $args[0]->has_children = ! empty( $children_elements[$element->$id_field] ); 
    $cb_args = array_merge( array(&$output, $element, $depth), $args);
    call_user_func_array(array(&$this, 'start_el'), $cb_args);

    $id = $element->$id_field;

    ⁄⁄ descend only when the depth is right and there are childrens for this element
    if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) {

      foreach( $children_elements[ $id ] as $child ){

        if ( !isset($newlevel) ) {
          $newlevel = true;
          ⁄⁄start the child delimiter
          $cb_args = array_merge( array(&$output, $depth), $args);
          call_user_func_array(array(&$this, 'start_lvl'), $cb_args);
        }
        $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output );
      }
        unset( $children_elements[ $id ] );
    }

    if ( isset($newlevel) && $newlevel ){
      ⁄⁄end the child delimiter
      $cb_args = array_merge( array(&$output, $depth), $args);
      call_user_func_array(array(&$this, 'end_lvl'), $cb_args);
    }

    ⁄⁄end this element
    $cb_args = array_merge( array(&$output, $element, $depth), $args);
    call_user_func_array(array(&$this, 'end_el'), $cb_args);

  }

}

 

마지막으로 "custom.css" 스타일시트 파일을 열어서 다음의 스타일을 추가합니다. 이것은 부트스트랩 네비게이션 메뉴가 브라우저 가로크기가 일정 크기 이하로 줄었을 경우 네비게이션이 드롭다운 방식 바뀔 때 제대로 동작하지 않는 경우를 약간 수정해 줍니다. 그래도 약간의 버그는 있는데 메뉴를 한 번 폈다가 접은 후 다시 펴야지 제대로 동작합니다(아직 완벽한 수정방법은 찾지 못했네요).

⁄* 부트스트랩 드롭다운 패치 *⁄
.dropdown-backdrop {
	position: static;
}

 

<부트스트랩 적용 php소스 : 워드프레스 완벽입문 참조>

 

블로그 이미지

환타73

디지털 콘텐츠 제작 및 연구 & 개발. 온오프라인 강의.

,

부트스트랩으로 레이아웃을 잡기 위해서는 코딩의 기본구조를 먼저 알아야 합니다. 부트스트랩의 레이아웃 구조를 위해서 알아야 할 것은 사실 몇가지 없기 때문에 익히기 어렵지 않습니다. 부트스트랩 홈페이지에서 Scaffolding 부분에서 이를 확인할 수 있습니다.

레이아웃 코딩을 위한 css 클래스(class) "container", "row", "span", "offset"의 뜻을 알아보겠습니다.

container 는 레이아웃 구성하는 가장 큰 부분으로 아래의 레이아웃에서 가장 외각선이라고 보면 이해가 쉽습니다. 일반적으로 홈페이지 소스에서 한 번 사용하는 경우가 대부분입니다.


<div class="container">
네비게이션



이미지 슬라이더

최근 포스트




최근 포스트


최근 포스트


하단 푸터 & 카피라이트
</div>

 

row 는 레이아웃 구성에서 가로 '열'을 뜻합니다. 아래에서 "네비게이션", "이미지 슬라이더", " 최근포스트 3개", "하단 푸터 & 카피라이트" 부분이 각각의 row '열'을 구성합니다.


<div class="container">
<div class="row">네비게이션</div>



<div class="row">이미지 슬라이더</div>

<div class="row">최근 포스트




최근 포스트


최근 포스트</div>


<div class="row">하단 푸터 & 카피라이트</div>
</div>

 

span은 세로 '행(column)'을 뜻합니다. 다른 말로 '단'이라고도 말할 수 있습니다.
부트스트랩은 전체적으로 12열을 지원하고, 일반적으로 1단, 2단, 3단, 4단 정도로 레이아웃으로 설계합니다. 아래에서 "네비게이션", "이미지 슬라이더", "하단 푸터 & 카피라이트" 부분은 1단 구성, "최근 포스트" 부분은 3단 구성입니다.

span1 부터 span12까지가 있으며,
1단 구성을 위해서는 span12 (12행을 모두 사용 : 12행*1단=12행),
2단 구성은 span6 (6행을 사용 : 6행*2단=12행),
3단 구성은 span4 (4행을 사용 : 4행*3단=12행),
4단 구성은 span3 (3행을 사용 : 3행*4단=12행) 입니다.


<div class="container">
<div class="row"><div class="span12">네비게이션</div></div>



<div class="row"><div class="span12">이미지 슬라이더</div></div>

<div class="row">
<div class="span4">
최근 포스트
</div>




<div class="span4">
최근 포스트</div>



<div class="span4">
최근 포스트</div>
</div>


<div class="row"><div class="span12">하단 푸터 & 카피라이트</div></div>
</div>

 

offset은 span 클래스 뒤에 위치하여 함께 쓰이면서 '들여쓰기'처럼 빈 열을 추가합니다.


<div class="container">
<div class="row"><div class="span12">네비게이션</div></div>



<div class="row"><div class="span12">이미지 슬라이더</div></div>

<div class="row">
{빈 공간}




<div class="span4 offset4">
최근 포스트</div>



<div class="span4">
최근 포스트</div>
</div>


<div class="row"><div class="span12">하단 푸터 & 카피라이트</div></div>
</div>

 

이들 클래스를 스타일 요소에 클래스로 지정하여 레이아웃을 설계할 수 있습니다.

 

블로그 이미지

환타73

디지털 콘텐츠 제작 및 연구 & 개발. 온오프라인 강의.

,

부트스트랩을 테마 디렉토리에 업로드를 했다고 그냥 적용 되는 것이 아니기 때문에 부트스트랩을 등록해 주는 과정이 필요합니다. 부트스트랩이 설치된 디렉토리 및 css 파일, js 파일 등을 테마의 함수 파일에 넣어야 합니다.

테마의 함수는 기본적으로 테마 루트 디렉토리에 있는 "functions.php" 에서 정의, 등록합니다.
이는 어디까지나 기본값이 그렇다는 것이고 테마마다 조금씩 달리할 수도 있는데 상용 테마의 경우 functions.php 를 일종의 다른 함수 파일을 불러오는 역할만 맡겨버리고 실제의 함수들은 용도별로 여러 파일로 나눠 프로그래밍하는 경우가 많습니다.

여기서는 직접 functions.php 가장 아래에 부트스트랩을 불러오는 코드를 넣겠습니다.

<소스내용>

 
/*---------------------------------------------------------------------
 * 커스터마이징
 *---------------------------------------------------------------------
 */

/* 
 * 부트스트랩 등록 & 커스텀 스타일 시트 등록
 */

function aca_styles() {
	wp_enqueue_style('bootstrap-stylesheet', get_stylesheet_directory_uri() . '/css/bootstrap.css');
	wp_enqueue_script('bootstrap-script', get_stylesheet_directory_uri() . '/js/bootstrap.js', array('jquery'));
	wp_enqueue_style('custom-stylesheet', get_stylesheet_directory_uri() . '/custom.css');
}
add_action('wp_enqueue_scripts', 'aca_styles');

 

위의 소스를 functions.php 에 넣게 되면 부트스트랩을 위한 스타일시트와 자바스크립트 그리고 사용자 정의 스타일시트를 테마에 적용한다는 뜻입니다.

탐색기에서 마우스 오른쪽 버튼을 클릭하여 <새로 만들기> - <텍스트 문서>를 선택합니다. 그리고 만들어진 파일의 이름을 "custom.css"로 변경하고 이를 FTP를 사용하거나 Theme Editor 를 사용하여 테마의 루트 디렉토리에 업로드합니다.

 

 

위의 과정을 통해 부트스트랩의 스타일시트가 aca 테마에 적용되었습니다.

 

이전과 별 차이가 없군요. 우선 적용이 제대로 되었는지 사용자 정의 스타일시트를 수정해 보겠습니다.
테마 에디터에서 custom.css 파일을 클릭하고, 편집창에 구글 폰트 라이브러리에서 나눔고딕 폰트를 불러오는 코드를 넣습니다.

<소스내용>

/* 나눔폰트 */
@import url(http://fonts.googleapis.com/earlyaccess/nanumgothic.css);

/* 나눔폰트적용 */
body {
	font-family: 'Nanum Gothic','Dotum';
}

 

나눔고딕 폰트가 적용된 것으로 추가한 코드가 제대로 동작하고 있는 것을 확인할 수 있습니다.  

 

블로그 이미지

환타73

디지털 콘텐츠 제작 및 연구 & 개발. 온오프라인 강의.

,

_S로 만들어진 aca 테마를 워드프레스에서 등록을 하고 활성화 합니다. 그리고 화면 좌측 상단의 [홈 아이콘을]을 [ctrl+ 클릭]하여 새 탭에서 페이지를 열어보면 아무런 디자인도 입혀지지 않은 정말 깨끗한 화면이 출력됩니다. 왜냐하면 아직 레이아웃에 맞춰서 정렬이 되어있지 않기 때문입니다. 거기에다가 내용도 입력된 것이 없고, 메뉴도 정해지지 않았고... 등등 아직 갈 길이 멉니다.

_S 테마 기본 모양_S 테마 기본 모양

 

이제 레이아웃을 설계해야 합니다. 우선은 첫페이지를 디자인 하는데, 심플하게 사이드바는 없이 그냥 상단 네비게이션, 중단 최근포스트, 하단 푸터 & 카피라이트 를 세로로 쭈욱 나열하는 모양으로 하겠습니다. 그리고 상단 네비게이션과 중단 최근 포스트 사이에 이미지 슬라이더를 넣을 것입니다.


네비게이션



이미지 슬라이더

최근 포스트




최근 포스트


최근 포스트


하단 푸터 & 카피라이트

워드프레스 홈페이지의 가장 큰 장점 중에 하나로 소개되어지는 것이 무엇일까요?
바로 "반응형(Responsive) 홈페이지"라는 것입니다. 반응형 홈페이지가 뭐지? 라는 분...은 설마 없으시겠죠.
바로 컴퓨터 모니터, 스마트 폰, 스마트 패드 등의 여러 기기 및 화면을 체크해서 가장 컨텐츠를 보기 편한 형태로 레이아웃을 재정렬 하는 기능입니다. 정확하게는 워드프레스가 지원한다기 보다 HTML5와 CSS3 등을 사용하여 미디어 쿼리를 적용하여 코딩된 "테마"가 이 기능을 구현하는 것이죠. 몇 년전까지만 해도 "반응형"이라는 말 조차 없었습니다.

반응형 레이아웃반응형 레이아웃

 

_S로 aca 테마를 반응형으로 만들기 위해서는 마찬가지로 일일이 직접 미디어 쿼리를 작성하고 코딩을 해야 하는데 이 일이 상당한 시간과 노력을 필요로 합니다. 그렇기 때문에 웹개발자들은 빠르고 편한 개발을 위해서 어떤 틀을 만들어 내었고, 그 중 가장 대표적인 것이 바로 부트스트랩(Bootstrap) 입니다.
부트스트랩은 트위터의 웹개발자들이 만들었고, 전 세계적으로 많이 사용되고 있습니다. 이런 일련의 개발틀을 "프레임워크(Framework)"라고 합니다. 이 프레임 워크를 사용해서 반응형 테마를 구현할 수 있습니다.

부트스트랩 홈페이지에서 부트스트랩 2.3.2 버전을 다운 받습니다.
http://getbootstrap.com/2.3.2/

부트스트랩 2.3.2부트스트랩 2.3.2

 

최신 버전은 3.1.1 인데 (2014년 4월 기준) 왜 구버전을 사용하냐면 최신버전은 모바일 홈페이지 제작 쪽에 좀 더 특화되어 있기 때문입니다.
(라기 보단 2.3.2 버전 보다 사용이 좀 복잡해져서...랄까요;;;)

그냥 [Download Bootstrap]을 클릭해도 되고, 상단의 Costomize 항목을 통해서 여러 옵션을 수정해서 다운로드 해도 됩니다. 여기서는 기본값으로 그냥 받을 것이므로 2.3.2 메인페이지에서 다운로드 받습니다.

"bootstrap.zip" 파일이 다운로드 되면 적당한 곳에 압축을 풉니다. css, img, js 세 개의 폴더와 내부의 파일들이 생성되는데 이들을 FTP를 사용해 테마가 설치된 곳에 업로드 합니다.

부트스트랩 파일부트스트랩 파일

관리자에서 외모 - Theme Editor 로 들어가서 확인해보면 몇 개의 디렉토리가 새로 생성된 것을 볼 수 있습니다.
주의할 점은 워드프레스 기본 편집기에서는 제대로 확인이 되지 않기 때문에 편집 플러그인 WP Editor 를 먼저 설치해야 합니다. 워드프레스로 홈페이지 제작을 하기 위해서 꼭 필요한 플러그인 입니다.

WP Editor
http://wordpress.org/plugins/wp-editor/

WP Editor가 설치되어 있다면 테마를 구성하고 있는 파일들과 디렉토리들을 볼 수 있고, 간단하게 나마 파일도 업로드 할 수 있습니다. 파일 업로드 기능은 테마의 루트 및 서브 디렉토리에 새로 파일을 올리는 정도의 기능만 지원합니다. 아쉽게도 덮어쓰기는 지원하지 않습니다.

 


블로그 이미지

환타73

디지털 콘텐츠 제작 및 연구 & 개발. 온오프라인 강의.

,