it-swarm.dev

Přidání atributů stránky Metabox a šablony stránek do stránky Upravit příspěvky?

( Poznámka moderátorů: Titul byl původně "Jak mohu přidat" atributy stránky "a/nebo" atributy stránky> šablona "výběr do editoru POSTS")

WP v současné době umožňuje pouze přiřazení „šablony“ na Stránky (tj. post_type=='page'.) Tuto funkci bych rád rozšířil i na příspěvky (tj. post_type=='post'.)

Jak mohu přidat "Stránky atributy" meta box a konkrétněji přepínač šablony do editoru příspěvků?

Předpokládám, že to je kód, který umístím do mého functions.php pro své téma.

UPDATE: Podařilo se mi přidat do rozesílacího editoru rozbalovací nabídku šablon šablon jednoduchým přidáním html výběrového pole do mého stávajícího pole vlastních možností meta. Tady je kód, který používám ...

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

A zde je funkce, která zapisuje možnosti a pole pro výběr šablony ...

//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
}

A konečně, kód pro zachycení vybraných hodnot při ukládání ...

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;
}

Věřím, že vše, co zbývá, je (1) zachycení vybrané šablony a její přidání do příspěvku meta pro tento příspěvek a (2) modifikace index.php a single.php tak, aby používaly zvolenou šablonu.

13
Scott B

Nenávist být nositelem špatných zpráv, ale WordPress hardcodes funkce šablony stránky na stránku "stránku" typ příspěvku , přinejmenším v3.0 (to by mohlo změnit v budoucích verzích, ale je tu není to konkrétní iniciativa, kterou jsem si vědom, že to ještě mám změnit, takže je to jeden z mála časů, kdy se snažím vymyslet, jak se něco obejít bez hackování jádra.]

Řešení, se kterým jsem přišel, je v podstatě zkopírovat příslušný kód z jádra WordPressu a upravit jej podle našich potřeb. Zde jsou kroky (čísla řádků jsou z verze 3.0):

  1. Zkopírujte funkci page_attributes_meta_box()z řádku 535 /wp-admin/includes/meta-boxes.php a upravte ji tak, aby vyhovovala.

  2. Kódovat add_meta_boxes hook přidat metabox vytvořený v # 1.

  3. Zkopírujte funkci get_page_templates()z řádku 166 /wp-admin/includes/theme.php a upravte podle potřeby.

  4. Zkopírujte funkci page_template_dropdown()z řádku 2550 /wp-admin/includes/template.php a upravte ji tak, aby vyhovovala.

  5. Přidat šablonu příspěvku k vašemu tématu.

  6. Kód a save_post hook umožňující uložení názvu souboru poštovní šablony po uložení.

  7. Kód a single_template hook pro načtení šablony příspěvku pro přidružené příspěvky.

Teď s tím!


1. Zkopírujte funkci page_attributes_meta_box()

Jako náš první krok musíte zkopírovat funkci page_attributes_meta_box() z řádku 535 /wp-admin/includes/meta-boxes.php a já jsem se rozhodl jej přejmenovat post_template_meta_box(). Vzhledem k tomu, že jste žádali pouze o šablony stránek, vynechal jsem kód pro zadání nadřazeného příspěvku a pro zadání pořadí, které kód zjednodušuje. Také jsem se rozhodl použít postmeta pro to, spíše než zkusit znovu použít vlastnost objektu page_template, aby se zabránilo případným nekompatibilitám způsobeným neúmyslným spojením. Tak tady je kód:

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. Kódovat add_meta_boxes háček

Dalším krokem je přidání metaboxu pomocí háku 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. Zkopírujte funkci get_page_templates()

Předpokládal jsem, že by bylo rozumné rozlišovat mezi šablonami stránek a šablonou příspěvku, tedy potřebou funkce get_post_templates() na základě get_page_templates() z řádku 166 /wp-admin/includes/theme.php. Namísto použití značky Template Name:, kterou tyto šablony stránek používají, používá tato funkce značku Post Template: místo toho, kterou můžete vidět níže.

Také jsem odfiltroval inspekci functions.php(není si jistý, jak get_page_templates() kdy fungoval správně bez toho, ale cokoliv!) A jediné, co zbývá, je změnit odkazy na slovo page na post pro čitelnost údržby po silnici:

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. Zkopírujte funkci page_template_dropdown()

Podobně zkopírujte page_template_dropdown() z řádku 2550 /wp-admin/includes/template.php a vytvořte post_template_dropdown() a jednoduše jej změňte na volání get_post_templates() místo:

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. Přidejte šablonu příspěvku

Dalším krokem je přidání šablony post pro testování. Pomocí značky Post Template: zmíněné v kroku č. 3 zkopírujte soubor single.php z motivu do single-test.php a přidejte následující záhlaví komentáře (ujistěte se, že v souboru single-test.php něco změníte, abyste mohli zjistit, že se načítá místo single.php):

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

Po provedení kroků # 1 až # 5 se na stránce editoru příspěvků zobrazí vaše metabox "Šablony příspěvků":

 What a Post Templates Metabox looked like when added to WordPress 3.0 
(zdroj: mikeschinkel.com )

6. Kód a save_post hook

Nyní, když máte editoru na druhou stranu, musíte skutečně uložit název souboru šablony stránky na postmeta, když uživatel klikne na tlačítko Publikovat. Zde je kód:

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. Kódovat single_template háček

A nakonec musíte skutečně dostat WordPress použít nové šablony příspěvků. To provedete pomocí zaháknutí single_template a vrácením požadovaného názvu šablony pro příspěvky, které byly přiřazeny:

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;
}

A to je o tom!

NOTEže Idid notvezme v úvahu Vlastní typy příspěvků , pouze post_type=='post'. Domnívám se, že adresování vlastních typů příspěvků by vyžadovalo rozlišování mezi různými typy příspěvků, a ačkoli to není příliš obtížné, nepokoušel jsem se to tady.

11
MikeSchinkel

Wordpress umožňuje přidat Meta do kategorií pomocí pluginu:

K tomu musíte přidat jednu z různých rozšíření, která přidávají meta do kategorií (napodobování stránek, které se dostanou z krabice), Simple Term Meta dělá tuto práci pěkně.

N.B. WordPress 3.x je nutný pro rozšíření kategorií.

Poté můžete použít:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Použijte Functions.php pro přidání metod, které chcete dělat, např.

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']);                  
}

Volání nových polí v tématech je snadné:

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

Další podrobnosti a příklady: http://www.wphub.com/adding-metadata-taxonomy-terms/

0
Jay