사이드 바 위젯의 사용자 정의 게시물 유형 데이터?


10

(참고 :이 질문은 원래 맞춤 입력란에 관한 것이지만 @MikeSchinkel은 맞춤 게시 유형과 관련된 더 나은 솔루션을 가졌습니다)

내 사이트에는 사이드 바에 동일한 데이터를 표시하려는 여러 페이지가 있습니다. 예를 들어, 다음과 같은 구조에서 :

-Home
-Cars 
 -Volvo 850 overview 
 -Volvo 850 tech spec 
 -Volvo 850 pictures
 -Porsche 911 overview
 -Porsche 911 tech spec
 -Porsche 911 pictures
-Roads 
 -Route 66 overview 
 -Route 66 history 
 -Route 66 pictures
 -Pan-American Highway overview
 -Pan-American Highway history
 -Pan-American Highway pictures

모든 볼보 850 페이지가 사이드 바에 동일한 데이터를 표시하고 모든 포르쉐 페이지에 다른 데이터 세트 (예 : 속도, 메이커 등)를 표시하고 싶습니다.

도로 페이지에는 각 도로에 대한 고유 한 데이터 세트가 있습니다. 자동차와 도로에는 자체 페이지 템플릿이 있으며 오른쪽 사이드 바를 얻는 방법은 sidebar.php 내에서 다음과 같습니다.

if ( is_page_template('car-profile-template.php') ) :
// show car widgets

다음은 예시 페이지 인 Volvo 850 Pictures 페이지입니다. 다른 Volvo 850 페이지에도 동일한 (왼쪽) 사이드 바가 나타나야하지만 오른쪽의 내용은 페이지 내용 일뿐입니다.

|  Home   Cars   Roads                                |
--------------------------------------------------------
|   Overview     |     Volvo 840 Pictures              |
|   Tech Spec    |    (some pics)                      |
|  Pictures     |                                     |
------------------                                     |
| -Specs-        |                                     |
| Volvo 850      |                                     |
| Speed:150mph   |                                     |
| Maker:Volvo    |                                     |  
| Download PDF   |                                     |
------------------                                     |
| -Rating-       |                                     |
| Style:3        |                                     |
| Safety:5       |                                     |
| Reliablity:4   |                                     |
------------------                                     |

이 예에서 두 개의 사이드 바 위젯 인 스펙 및 등급은 사용자 정의 게시물 유형에서 정보를 가져와야합니다. 최종 사용자가 쉽게 편집 할 수있는 방법이 있습니까? 즉,이 사용자 지정 데이터를 한 번만 입력하면됩니다. 각 필드를 분리 할 필요는 없습니다 (예 : 모든 Spec을 Editor 필드에 입력하고 모든 Rating을 Excerpt 필드에 넣을 수 있음)


2
좋은 질문이며 제목과 질문 내용을 명확하게 편집하기 위해 편집 해 주셔서 감사합니다. 앞으로 비슷한 질문이있는 사람들에게 도움이 될 것입니다.
MikeSchinkel

답변:


14

최신 정보:

질문의 업데이트를 바탕으로 질문에 대한 질문을 아래 답변으로 수행 할 수 있다고 명시 적으로 언급해야한다고 생각 합니다. 표시하려는 각 항목에 대해 "자동차" 사용자 정의 게시물 유형의 사용자 정의 필드를 사용 했습니다. 주어진 차에 대한 모든 페이지.

사이드 바를 single-car.php아래에 포함 된 템플릿 파일에 하드 코딩하기 만하면 if명령문을 사용하여 다른 URL에 표시 할 컨텐츠를 결정합니다. 사이드 바를 위젯 화하고 위젯이 현재 게시물 ID에 대한 정보를 가져 오는 사용자 정의 위젯을 개발하려는 노력을 기울일 수 있지만 다른 사람들이 사용할 수 있도록 테마로 작성하지 않는 한 왜 둘 다?

실제로이 작업을 수행하는 미묘하게 다른 여러 가지 방법이 있지만 제안하는 방법은 귀하의 요구에 훌륭하게 궁금합니다.


안녕 @ cannyboy :

실제로 게시물에서 사용자 정의 필드를 공유하는 가장 좋은 방법은 무엇인지 모르겠습니다. 그러나 그것은 단지 당신이 필요로하는 적기 일 수 있습니다. 뭔가 어려워 보인다면 ...

다른 접근법?

... 아키텍처를 다르게 설계 할 수 있습니까? "Car"사용자 정의 게시물 유형 을 작성하는 것이 훨씬 낫다고 생각합니다. 그런 다음 각 "페이지" 에 대한 모든 것을 하나의 자동차 게시물 유형으로 저장할 수 있습니다 . 샘플 URL은 다음과 같습니다.

http://example.com/cars/volvo850/  <-- overview
http://example.com/cars/volvo850/tech-specs/
http://example.com/cars/volvo850/pictures/

맞춤 게시물 유형에 대해 알아보기

다음 질문에 대한 답변에서 맞춤 게시물 유형에 대해 자세히 알아볼 수 있습니다.

맞춤 게시물 유형 및 다시 쓰기 규칙

사용자 정의 포스트 유형 및 다음과 같은 코드를 사용하려는 여러 페이지 구현하기 위해 귀하의 등록 "자동차" 사용자 정의 포스트 유형을 다음 자동차 페이지에 대한 재 작성 규칙을 설정을 . 이 코드를 테마 functions.php파일이나 플러그인 중 원하는쪽에 넣으십시오 .

<?php
add_action('init','car_init');
function car_init() {
  register_post_type('car',
    array(
      'label'           => 'Cars',
      'public'          => true,
      'show_ui'         => true,
      'query_var'       => 'car',
      'rewrite'         => array('slug' => 'cars'),
      'hierarchical'    => true,
      //'supports'        => array('title','editor','custom-fields'),
    )
  );
  global $wp,$wp_rewrite;
  $wp->add_query_var('car-page');
  $wp_rewrite->add_rule('cars/([^/]+)/(tech-specs|pictures)','index.php?car=$matches[1]&car-page=$matches[2]', 'top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

자동차 - 특정 테마 템플릿 파일

그런 다음 테마에 자동차 전용 템플릿 파일필요합니다 . 이 기본 이름은입니다 single-car.php. if 문을 사용하여 렌더링 할 콘텐츠를 결정 하여 세 개의 URL ( (개요) , 'tech-specs''pictures' )을 모두 하나의 템플릿으로 렌더링하는 시작 템플릿을 코딩했습니다 .

<?php get_header(); ?>
<div id="container">
  <div id="content">
  <?php if ( have_posts() ): the_post(); ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <h1 class="entry-title"><?php the_title(); ?></h1>
    <div class="entry-content">
<?php if(is_car_techspecs()): ?>
  <a href="..">Back</a>
  <h1>Tech Specs</h1>
  The tech specs go here!
  <?php get_post_meta($post->ID,'_car_tech_specs'); ?>
<?php elseif (is_car_pictures()): ?>
  <a href="..">Back</a>
  <h1>Pictures</h1>
  Car Pictures go here!
  <?php get_post_meta($post->ID,'_car_pictures'); ?>
<?php else: ?>
  <ul>
    <h1>Overview</h1>
    <li><a href="tech-specs/">Tech Specs</a></li>
    <li><a href="pictures/">Pictures</a></li>
  </ul>
  <?php the_content(); ?>
<?php endif; ?>
      <?php the_content(); ?>
    </div>
  <?php endif; ?>
  </div>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

위의 예에서 get_post_meta(); 사용을 사용하면 매우 간단합니다 . 실제 사이트에는 훨씬 더 복잡해야합니다.

템플릿 태그 일명 도우미 기능

물론 if 문 조건 에서 템플릿 파일의 복잡성을 최소화하기 위해 일부 템플릿 태그 일명 도우미 기능을 사용했습니다 . 여기에 그것들이 있으며 테마 functions.php파일에도 이것들을 넣을 수 있습니다 :

function is_car_techspecs() {
  global $wp_query;
  return is_car_page('tech-specs');
}
function is_car_pictures() {
  global $wp_query;
  return is_car_page('pictures');
}

function is_car_page($page) {
  global $wp_query;
  return (isset($wp_query->query['car-page']) && $wp_query->query['car-page']==$page);
}

맞춤 게시물 유형 사랑으로 가득 찬 스크린 샷

해당 코드를 모두 갖추고 Volvo 850 과 같은 자동차 게시물을 추가 하면 다음 스크린 샷과 같이 작동하도록 할 수 있습니다.

개요 페이지

http://example.com/cars/volvo850/
(출처 : mikeschinkel.com )

기술 사양 페이지

http://example.com/cars/volvo850/tech-specs/

사진 페이지

http://example.com/cars/volvo850/pictures/


1
아주 좋아요 기술 사양 등의 정보가 동적이되도록 어떻게 설정 하시겠습니까 (예 에서처럼 하드 코딩 된 것이 아니라)?
Travis Northcutt

1
까다로운 질문이므로 사용 사례를 이해해야합니까, 아니면 추상적 인 가설인지 이해해야합니까? 잠재적 인 일치의 유한 목록을 알고 있기 때문에이 작업을 수행 할 수 있습니다. "일치 일치"인 경우 WordPress의 다른 일치 패턴을 무시합니다. 구체적인 예를 들어 주시면 웜 캔일 수도 있습니다.
MikeSchinkel 4

당신의 훌륭한 답변에 감사드립니다. 나는 이전에 사용자 정의 포스트 유형을 파지 한 적이 없으며 이상적인 솔루션처럼 보입니다. 주로 사이드 바 / 위젯과 관련하여 몇 가지 더 구체적인 내용으로 질문을 업데이트했습니다.
cannyboy

@mike 단지 가상적인 것입니다. 자세히 설명하자면 (예를 들어) 기술 사양 페이지의 정보가 관리자 대시 보드 어딘가에 (예 : 자동차를 설정하기 위해 분류법을 사용하는 사용자 지정 게시물 유형) 입력되도록 설정하는 방법이 궁금합니다. 템플릿 파일과 반대입니다.
Travis Northcutt

@tnorthcutt- "기술 사양 페이지의 정보"라고 말할 때 "하위 페이지 목록"을 의미한다고 가정합니다. 아니면 사용자 정의 필드를 의미합니까? 후자의 경우 정보가 사용자 정의 필드에 저장된다고 가정했습니다. 나의 예는 그것을 보여주지 않았다. 아마도 있어야합니까?
MikeSchinkel

1

나는 누군가가 당신이 게시 한 다른 질문 (부모 페이지 / 중간 페이지에 대해)에 대해 이미 이런 종류의 대답을했을 것이라고 생각하지만, 여기에 설명 된 내용을 기반으로 데이터를 구성하는 가장 좋은 방법은 다음과 같습니다.

 - Home
 - Volvo 850 (overview)
   - Volvo 850 tech spec
   - Volvo 850 pictures
 - Porsche 911 (overview)
   - Porsche 911 tech spec
   - Porsche 911 pictures

이렇게하면 부모 페이지와 메타 페이지에서 메타 필드를 한 번만 입력하면 부모에서 해당 메타 데이터를 가져올 수 있습니다.

<?php echo 'Top speed: '.get_post_meta($post->post_parent,'Top Speed',true); ?>

물론, 이것을 구성하는 더 좋은 방법은 모든 자동차 정보를 저장하고 페이지에 전달되어 사용되는 GET 요청에 따라 다양한 서브 페이지를 표시하는 각 자동차 모델에 대해 하나의 단일 사용자 정의 포스트 유형을 갖는 것입니다. 표시 할 템플릿을 결정하기위한 페이지 템플릿입니다. 이렇게하면 데이터 복제를 완전히 피할 수 있으며 나중에 템플릿에 더 많은 정보를 쉽게 추가 할 수 있습니다 ...

자세한 내용은...

나는 몇 가지 다른 방법으로 해냈습니다. 상담원 (회사 담당자)이 사용자 정의 게시물 유형으로 사용하는 한 사이트에서 게시물을 사용하여 해당 개인과 관련된 모든 데이터를 저장했지만 실제로는 해당 페이지를 표시하지 않았습니다. 대신 "에이전트 목록"페이지, "에이전트 성능 레코드"페이지 및 "이 에이전트에 문의"페이지가 있습니다.이 페이지는 항상 GET 변수와 함께 호출되어 해당 게시물에서 정보를 표시했습니다. 따라서 영구 링크는 site.com/agent-listing/?agent=john-smith 와 같은 형태 입니다.

다른 사이트에서는 한 페이지에 모든 정보를 설정하고 해당 페이지에 대한 세 개의보기를 모두 페이지 템플리트에 빌드했습니다. 귀하의 경우 site.com/cars/volvo-850/?pictures 와 유사 합니다.

그리고 페이지 템플릿에서 컨텐츠 상단 근처에 해당 변수에 대한 검사를 포함시킵니다.

if ($_GET['pictures']) {

 // template for pictures page

} else if ($_GET['tech-spec']) {

 // template for tech specs page 

} else {

 // overview template

}

고마워요! 마지막 제안을 위해,이 모든 사용자 정의 필드가있는 빈 페이지 (아마도 'Volvo 850 위젯 데이터'라고 함)를 만들고 다른 Volvo 850 페이지가 자동으로이 데이터를 가져옵니다 (또는 어떻게됩니까)? (이것은 어쨌든 내가하는 Appearance> Menus 메뉴에서 수동으로 메뉴를 구성해야 함을 의미합니다.) ... 또는 아마도 개요 페이지의 사용자 정의 필드에서 데이터를 가져올 수 있습니다.
cannyboy

나는 두 가지 방법으로 그것을했다. 설명을 위해 위의 답변을 편집했습니다. 말한 것처럼 메뉴 작성을 얼마나 자동화하고 싶은지에 따라 결과가 달라집니다.
goldenapples

죄송합니다. 방금 자세한 내용을 읽고 Mike가 이미 내가 말한 내용에 정확히 응답했음을 깨달았습니다.
goldenapples

0

맞춤 게시물 유형을 만들지 않고 각 페이지 또는 게시물에 대해 맞춤 사이드 바를 포함하려는 경우 우아한 사이드 바 플러그인을 사용할 수 있습니다. 이를 통해 우아한 제목 및 우아한 콘텐츠라는 추가 필드를 사용하여 게시물 또는 페이지 편집 화면에서 바로 사용자 정의 사이드 바 콘텐츠를 작성할 수 있습니다. 그러면 블로그에이 게시물이나 페이지가 표시 될 때 사이드 바 영역에 위젯으로 표시됩니다. 이 플러그인에 대한 자세한 내용은 http://www.mlynn.org/graceful-sidebar-plugin 에서 확인할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.