it-swarm.com.de

Hinzufügen von Seitenattributen Metabox und Seitenvorlagen zu den Beiträgen Seite bearbeiten?

( Hinweis für Moderatoren: Der Titel lautete ursprünglich "Wie kann ich dem POSTS-Editor den Selektor" Seitenattribute "und/oder" Seitenattribute> Vorlage "hinzufügen")

WP erlaubt derzeit nur die Zuweisung einer "Vorlage" zu Seiten (d. H. post_type=='page'). Ich möchte diese Funktionalität auch auf Posts (d. H. post_type=='post') ausweiten.

Wie kann ich das Feld "Seitenattribute" meta und insbesondere den Vorlagenumschalter zum Beitragseditor hinzufügen?

Ich gehe davon aus, dass dies der Code ist, den ich in meinen functions.php für mein Thema einfügen werde.

UPDATE: Ich habe es geschafft, das Pulldown-Menü für hartcodierte Vorlagen zu meinem Post-Editor hinzuzufügen, indem ich einfach das Auswahlfeld html zu meinem vorhandenen benutzerdefinierten Meta-Optionsfeld hinzufügte. Hier ist der Code, den ich dafür benutze ...

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

Und hier ist die Funktion, die die Optionen und das Auswahlfeld für die Vorlage ausgibt ...

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

Und schließlich der Code, um die ausgewählten Werte beim Speichern zu erfassen ...

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

Jetzt glaube ich, dass alles, was übrig bleibt, ist, (1) die ausgewählte Vorlage zu erfassen und der Post-Meta für diesen Post hinzuzufügen und (2) index.php und single.php so zu ändern, dass sie die ausgewählte Vorlage verwenden.

13
Scott B

Ich hasse es, der Überbringer von schlechten Nachrichten zu sein, aber WordPress codiert die Seitenvorlagenfunktionalität fest auf den "Seite" Posttyp , zumindest in v3.0 das könnte sich in Zukunft ändern Versionen, aber es gibt noch keine spezielle Initiative, die ich ändern kann. Dies ist eine der wenigen Situationen, in denen ich Probleme habe, etwas zu umgehen, ohne den Kern zu hacken.)

Die Lösung, die ich mir ausgedacht habe, besteht darin, den relevanten Code aus dem WordPress-Kern zu kopieren und an unsere Bedürfnisse anzupassen. Hier sind die Schritte (die Zeilennummern sind von v3.0.1):

  1. Kopieren Sie die Funktion page_attributes_meta_box()aus Zeile 535 von /wp-admin/includes/meta-boxes.php und passen Sie sie an.

  2. Code einen add_meta_boxes hook um die in # 1 erstellte Metabox hinzuzufügen.

  3. Kopieren Sie die Funktion get_page_templates()aus Zeile 166 von /wp-admin/includes/theme.php und passen Sie sie an.

  4. Kopieren Sie die Funktion page_template_dropdown()aus Zeile 2550 von /wp-admin/includes/template.php und passen Sie sie an.

  5. Eine Beitragsvorlage hinzufügen zu Ihrem Thema.

  6. Code a save_post hook , um das Speichern des Post-Template-Dateinamens beim Speichern zu ermöglichen.

  7. Code a single_template hook , um das Laden der Beitragsvorlage für die zugehörigen Beiträge zu ermöglichen.

Nun weiter damit!


1. Kopieren Sie die Funktion page_attributes_meta_box()

Als ersten Schritt müssen Sie die Funktion page_attributes_meta_box() aus Zeile 535 von /wp-admin/includes/meta-boxes.php kopieren, und ich habe beschlossen, sie in post_template_meta_box() umzubenennen. Da Sie nur nach Seitenvorlagen gefragt haben, habe ich den Code für die Angabe eines übergeordneten Posts und für die Angabe der Reihenfolge weggelassen, wodurch der Code viel einfacher wird. Ich habe mich auch für die Verwendung von Postmeta entschieden, anstatt zu versuchen, die page_template -Objekteigenschaft erneut zu verwenden, um mögliche Inkompatibilitäten durch unbeabsichtigtes Koppeln zu vermeiden. Also hier ist der Code:

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. Codieren Sie einen add_meta_boxes-Hook

Im nächsten Schritt fügen Sie die Metabox mit dem Hook add_meta_boxes hinzu:

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. Kopieren Sie die Funktion get_page_templates()

Ich ging davon aus, dass es nur Sinn macht, zwischen Seitenvorlagen und Beitragsvorlagen zu unterscheiden, weshalb eine get_post_templates()-Funktion erforderlich ist, die auf get_page_templates() aus Zeile 166 von /wp-admin/includes/theme.php basiert. Anstatt jedoch den Template Name:-Marker zu verwenden, für welche Seitenvorlagen diese Funktion verwendet wird, wird stattdessen ein Post Template:-Marker verwendet, den Sie unten sehen können.

Ich habe auch die Überprüfung von functions.php(nicht sicher, wie get_page_templates() jemals ohne das funktioniert hat, aber was auch immer! Herausgefiltert. Das Einzige, was übrig bleibt, ist, die Verweise auf das Wort page auf post zu ändern, um die Lesbarkeit der Wartung später zu gewährleisten:

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. Kopieren Sie die Funktion page_template_dropdown()

Kopieren Sie auf ähnliche Weise page_template_dropdown() aus Zeile 2550 von /wp-admin/includes/template.php, um post_template_dropdown() zu erstellen, und ändern Sie es einfach, um stattdessen get_post_templates() aufzurufen:

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. Fügen Sie eine Beitragsvorlage hinzu

Im nächsten Schritt fügen Sie eine Post-Vorlage zum Testen hinzu. Verwenden Sie die in Schritt 3 erwähnte Post Template:-Markierung, um single.php aus Ihrem Design in single-test.php zu kopieren, und fügen Sie den folgenden Kommentar-Header hinzu (Sie müssen darauf achten, dass Sie etwas in single-test.php ändern, damit Sie erkennen, dass es geladen wird, anstatt single.php:

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

Sobald Sie die Schritte 1 bis 5 ausgeführt haben, wird Ihre Metabox "Post Templates" auf Ihrer Post-Editor-Seite angezeigt:

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

6. Codieren Sie einen save_post-Hook

Nachdem Sie den Editor entfernt haben, müssen Sie den Dateinamen Ihrer Seitenvorlage tatsächlich auf Postmeta speichern, wenn der Benutzer auf "Veröffentlichen" klickt. Hier ist der Code dafür:

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. Codieren Sie einen single_template-Hook

Und zu guter Letzt müssen Sie WordPress installieren, um Ihre neuen Post-Vorlagen verwenden zu können. Sie tun dies, indem Sie single_template einbinden und Ihren gewünschten Vorlagennamen für die Posts zurückgeben, denen einer zugewiesen wurde:

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

Und das war's auch schon!

NOTEdass ichnichtberücksichtige Benutzerdefinierte Beitragstypen , nur post_type=='post'. Meiner Meinung nach würde das Adressieren von benutzerdefinierten Beitragstypen das Unterscheiden zwischen den verschiedenen Beitragstypen erfordern, und obwohl dies nicht allzu schwierig ist, habe ich dies hier nicht versucht.

11
MikeSchinkel

Mit Wordpress können Sie Meta zu Kategorien hinzufügen, indem Sie ein Plugin verwenden:

Um dies zu tun, müssen Sie eine der verschiedenen Erweiterungen hinzufügen, die Kategorien Meta hinzufügt (imitiert, welche Seiten aus der Box herauskommen). Simple Term Meta erledigt den Job gut.

N.B. WordPress 3.x wird zum Erweitern von Kategorien benötigt.

Danach können Sie verwenden:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Verwenden Sie Functions.php, um Methoden hinzuzufügen, mit denen Sie das tun können, was Sie möchten, z.

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

Das Aufrufen neuer Felder in Themen ist einfach:

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

Weitere Details und Beispiele: http://www.wphub.com/adding-metadata-taxonomy-terms/

0
Jay