게시물 편집 페이지에 페이지 속성 메타 박스 및 페이지 템플릿을 추가 하시겠습니까?


14

( 중재자 참고 사항 : 제목은 원래 ""페이지 속성 "및 / 또는"페이지 속성> 템플릿 "선택기를 POSTS 편집기에 추가하는 방법"이었습니다 .

WP는 현재 페이지에 "템플릿"을 할당 할 수만 있습니다 (예 : post_type=='page'.)이 기능을 게시물 (예 : post_type=='post'.) 로 확장하고 싶습니다 .

어떻게 추가 할 수 있습니다 "페이지 속성" , 더 구체적으로 게시물 편집기 템플릿 스위처를 메타 상자와?

나는 이것이 functions.php내 주제를 위해 내가 배치 할 코드라고 가정합니다 .

업데이트 : 기존의 사용자 정의 메타 옵션 상자에 선택 상자 html을 추가하여 하드 코딩 된 템플릿 풀다운 메뉴를 게시물 편집기에 추가했습니다. 여기에 내가 사용하는 코드가 있습니다 ...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

옵션과 템플릿 선택 상자를 작성하는 기능은 다음과 같습니다.

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

마지막으로 저장시 선택한 값을 캡처하는 코드는 ...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

이제 남은 것은 (1) 선택한 템플릿을 캡처 하여이 게시물의 게시물 메타에 추가하고 (2) 선택한 템플릿을 사용하도록 index.php 및 single.php를 수정하는 것입니다.


@ Scott B : 글쎄, 나는 당신이 그것도 연구하고 있음을보기 전에 내 모든 대답을 썼다. 따라서 당신은 원래의 질문을 따르지 않고 색인 옵션이없는 것과는 다소 다른 방향으로 취한 것처럼 보인다. 잘만되면 내가 여전히 당신을 위해 가치가 있습니다. 그렇지 않다면 다른 사람들에게 도움이 될 것입니다.
MikeSchinkel

네, 당신은 질문에 대답했습니다. 디렉토리를 구문 분석 할 필요가 없으며 특정 템플릿의 값을 하드 코딩 할 수 있다는 것을 깨달았을 때 약간 다른 방법을 택했습니다. 실제로 WP가 게시물에 올바른 할당 된 템플릿을 사용하도록하려면 일부 코드를 빌려야 할 것입니다.
Scott B

답변:


12

나쁜 소식을 전하는 사람을 싫어하지만 WordPress는 페이지 템플릿 기능을 v3.0 이상에서 "페이지" 게시 유형으로 하드 코딩합니다 (향후 버전에서는 변경 될 수 있지만 변경하려는 특정 이니셔티브는 없습니다) 그래서 이것은 코어를 해킹하지 않고 무언가를 해결하는 방법을 찾기 위해 고심하고있는 몇 번의 시간 중 하나입니다.)

내가 생각해 낸 해결책은 기본적으로 WordPress 핵심에서 관련 코드를 복사하여 필요에 맞게 수정하는 것입니다. 단계는 다음과 같습니다 (행 번호는 v3.0.1의 것임).

  1. page_attributes_meta_box() 라인 535 에서 함수복사하고 적절하게 /wp-admin/includes/meta-boxes.php수정하십시오.

  2. add_meta_boxes# 1에서 만든 메타 박스를 추가 후크 를 코딩하십시오.

  3. get_page_templates()166 번째 줄 에서 함수복사하여/wp-admin/includes/theme.php 수정하십시오.

  4. page_template_dropdown() 2550 행 에서 기능복사하고 적절하게 /wp-admin/includes/template.php수정하십시오.

  5. 테마에 게시물 템플릿추가하십시오 .

  6. 코드는 save_post후크 저장에 포스트 템플릿 파일 이름으로 저장 가능합니다.

  7. 코드는 single_template후크 관련 게시물에 대한 게시 템플릿의 로딩을 가능하게합니다.

이제 그것으로!


1. page_attributes_meta_box()기능을 복사

첫 번째 단계 page_attributes_meta_box()로의 라인 535 에서 함수 를 복사해야 /wp-admin/includes/meta-boxes.php하며 이름을 변경하기로 선택했습니다 post_template_meta_box(). 페이지 템플릿 만 요청했기 때문에 부모 게시물을 지정하고 순서를 지정하여 코드를 훨씬 간단하게 만드는 코드를 생략했습니다. 또한 page_template의도하지 않은 커플 링으로 인한 비 호환성을 피하고 잠재적 인 비 호환성을 피하기 위해 객체 속성 을 재사용하려고 시도하는 대신 postmeta를 사용하기로했습니다 . 코드는 다음과 같습니다.

function post_template_meta_box($post) {
  if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
    $template = get_post_meta($post->ID,'_post_template',true);
    ?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
  } ?>
<?php
}

2. add_meta_boxes후크를 코딩

다음 단계는 add_meta_boxes후크를 사용하여 메타 박스를 추가하는 것입니다 .

add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
    add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}

3. get_page_templates()기능을 복사

페이지 템플릿과 게시물 템플릿을 구분하는 것이 타당하다고 생각했기 때문에의 라인 166을 get_post_templates()기반으로 한 기능에 대한 필요성 get_page_templates()/wp-admin/includes/theme.php있습니다. 그러나이 Template Name:페이지 템플릿을 사용하는 Post Template:마커를 사용하는 대신 아래에서 볼 수 있는 마커를 사용 합니다.

또한 검사 필터링 functions.php (하지 않도록하는 방법 get_page_templates()!이없이 올바르게 작동 적 있지만, 무엇이든) 그리고 남은 건 오직 말씀을 변경 참조하는 것입니다 page에 대한 post도로 아래로 유지 보수 가독성을 위해 :

function get_post_templates() {
  $themes = get_themes();
  $theme = get_current_theme();
  $templates = $themes[$theme]['Template Files'];
  $post_templates = array();

  if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
      $basename = str_replace($base, '', $template);
      if ($basename != 'functions.php') {
        // don't allow template files in subdirectories
        if ( false !== strpos($basename, '/') )
          continue;

        $template_data = implode( '', file( $template ));

        $name = '';
        if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
          $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
          $post_templates[trim( $name )] = $basename;
        }
      }
    }
  }

  return $post_templates;
}

4. page_template_dropdown()기능을 복사

마찬가지로 복사 page_template_dropdown()라인 2550의에서 /wp-admin/includes/template.php만들 post_template_dropdown()단순히 전화를 변경 get_post_templates()하는 대신 :

function post_template_dropdown( $default = '' ) {
  $templates = get_post_templates();
  ksort( $templates );
  foreach (array_keys( $templates ) as $template )
    : if ( $default == $templates[$template] )
      $selected = " selected='selected'";
    else
      $selected = '';
  echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
  endforeach;
}

5. 게시물 템플릿 추가

다음 단계는 테스트 용 포스트 템플릿을 추가하는 것입니다. Post Template:3 단계에서 언급 한 마커를 사용 single.php하여 테마에서 복사 single-test.php하고 다음 주석 헤더를 추가하십시오 ( 무언가 single-test.php대신 수정하여 로드하지 말고로드하십시오 single.php) .

/**
 * Post Template: My Test Template
 */

1 단계에서 5 단계까지 1 단계를 완료하면 게시물 편집기 페이지에 "게시물 템플릿" 메타 박스가 나타납니다.

WordPress 3.0에 추가 될 때 포스트 템플릿 메타 박스의 모양
(출처 : mikeschinkel.com )

6. save_post후크를 코딩

이제 편집기를 제곱했습니다. 사용자가 "게시"를 클릭하면 실제로 페이지 템플리트 파일 이름을 postmeta에 저장해야합니다. 그 코드는 다음과 같습니다.

add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
  if ($post->post_type=='post' && !empty($_POST['post_template']))
    update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}

7. single_template후크를 코딩

마지막으로 새 게시물 템플릿을 사용하려면 실제로 WordPress를 가져와야합니다. single_template할당 된 게시물에 대해 원하는 템플릿 이름을 연결 하고 반환하면됩니다.

add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
  global $wp_query;
  $post = $wp_query->get_queried_object();
  if ($post) {
    $post_template = get_post_meta($post->ID,'_post_template',true);
    if (!empty($post_template) && $post_template!='default')
      $template = get_stylesheet_directory() . "/{$post_template}";
  }
  return $template;
}

그게 다야!

참고 나는 것을 하지 않았다 고려 사용자 정의 포스트 유형post_type=='post'. 내 의견으로는 맞춤 게시물 유형을 다루는 것은 다른 게시물 유형을 차별화해야하며 지나치게 어렵지는 않지만 여기서 시도하지는 않았습니다.


큰! 기본 WordPress 기능을 복사하는 것과 동일한 방법으로 편집기에서 거의 완전한 코드로 잠들었습니다 (완료되었지만 테스트하지 않았으므로 게시하지 않았습니다). :)
sorich87

@ sorich87- 당신은 "당신은 잠에서 깨어 라 !" 진지하게, 유일한 농담. 실제로 작동시키는 합리적인 방법은 단 하나뿐이므로 코드가 동일 할 것입니다.
MikeSchinkel

마이크, 넌 계속 놀래켜 시간을내어 문제를 해결해 주셔서 대단히 감사합니다.
Scott B

@ sorich87-작업 해 주셔서 감사합니다. 노력해 주셔서 감사합니다.
Scott B

1
@Scott B : 문제 없습니다. 기꺼이 도와 드리겠습니다. 나는 잠재적으로 많은 사람들을 도울 수있는 합리적으로 일반적인 질문을 찾고, 질문을하는 사람뿐만 아니라 다음에 오는 사람들을 위해 대답하려고 노력합니다.
MikeSchinkel

0

Wordpress에서는 플러그인을 사용하여 카테고리에 메타를 추가 할 수 있습니다.

이렇게하려면 범주에 메타를 추가하는 다양한 확장 중 하나를 추가해야합니다 (즉, 페이지에서 나오는 페이지를 모방 함). 단순 용어 메타 는 작업을 훌륭하게 수행합니다.

카테고리를 확장하려면 NB WordPress 3.x가 필요합니다.

그 후에는 다음을 사용할 수 있습니다.

  • add_term_meta
  • update_term_meta
  • get_term_meta

Functions.php를 사용하여 원하는 것을 수행하는 메소드를 추가하십시오.

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

테마에서 새로운 필드를 호출하는 것은 쉽습니다.

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

자세한 내용 및 예 : http://www.wphub.com/adding-metadata-taxonomy-terms/

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