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


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.