Seiten mit 2 Spalten

Ich habe mir viele der verfügbaren Plugins angeschaut, aber alle scheinen zu schwierig zu sein oder bieten nicht genügend Flexibilität.

Plugins habe ich schon ausprobiert:

  • WP Post-Spalten
  • Magazin Spalten
  • WP-Spalten
  • WP Einfache Spalten

Ich schaue mir auch eine an, die per-page-Seitenleisten erlaubt, die funktionieren könnten , aber die Spalte ist für den Inhalt getrennt, was es schwierig zu verwalten macht, und das Fehlen eines WYSIWYG-Editors erschwert es denjenigen, die nicht mit HTML vertraut sind.

Was ich versuche zu erreichen:

Das Projekt, an dem ich arbeite, erfordert, dass die Personen, die für die Eingabe des Inhalts zuständig sind, in der Lage sind, Inhalt zu einer 3/4-Spalte, die den Hauptinhalt darstellt, und einer 1/4-Spalte zu dem Hauptinhalt hinzuzufügen. Der Inhalt der 1/4 Spalte ändert sich abhängig von der Seite.

Für die meisten Entwickler ist es einfach, HTML zu schreiben, um das im Inhalt der Post zu tun, aber die Leute, die den Inhalt hinzufügen / verändern, kennen HTML nicht, also suche ich nach Alternativen. Ich würde es vorziehen, wenn sie sich Codes (oder kurze Codes) nicht merken müssten.

Um die Dinge zu komplizieren, habe ich 3 Vorlagen: “1 Spalte”, “2 Spalten (1/4, 3/4)” und “2 Spalten (3/4, 1/4)”.

Die Frage:

Hat jemand eine einfache Lösung für dieses Problem gefunden? Gibt es ein Plugin, von dem ich nicht weiß, dass es die Möglichkeit hätte, mehrere Inhalte (Spalten) für eine einzelne Seite zu haben? Oder gibt es etwas, mit dem ich Widgets einen WYSIWYG-Editor hinzufügen könnte?

Ich freue mich auf Ihre Gedanken und Empfehlungen.

Solutions Collecting From Web of "Seiten mit 2 Spalten"

Hier ist ein interessanter Ansatz:

Der Plan und die Logik:

Benutzerdefinierte Felder sind eine integrierte functionalität, die perfekt zu unseren Anforderungen passt. Wir können ein neues benutzerdefiniertes Feld festlegen und dieses Feld dann verwenden, um unsere benutzerdefinierten Daten einzugeben und zu speichern. Wir können dann ein Widget verwenden, um diesen benutzerdefinierten Inhalt in der Seitenleiste unserer einzelnen Seiten anzuzeigen

Beispiel für ein benutzerdefiniertes Feld im Post-Editor

Bildbeschreibung hier eingeben

Mögliche Probleme:

Es gibt ein paar Probleme, die wir berücksichtigen müssen

  • Ob ein Widget Inhalt hat oder nicht, es zählt als aktive Seitenleiste. Das Problem ist, dass wir das Widget nicht auf einer anderen Seite der einzelnen Post-Seite anzeigen möchten. Außerdem möchten wir die Seitenleiste ausblenden, wenn wir keine anderen Widgets haben und unser benutzerdefiniertes Widget leer ist. Es gibt keine is_active_sidebar() , um die bedingte statement is_active_sidebar() auf false zu setzen oder eine ähnliche function zu haben, um eine Seitenleiste auszublenden, wenn wir nur eine Sidebar mit einem leeren Widget haben

  • Einige Themen haben nicht die Möglichkeit, zwischen dem Modus mit voller Breite und dem normalen Modus mit Seitenleiste zu wechseln, wenn der Status einer Seitenleiste von aktiv zu inaktiv wechselt und umgekehrt

LÖSUNGEN FÜR UNSER HAUPTTEIL:

Unser Hauptproblem besteht darin, das Widget auszublenden, wenn es leer ist oder wenn wir uns auf einer Seite befinden, die keine einzelne Post-Seite ist. Unser Plan hier wäre, das benutzerdefinierte Widget aus dem Array von Sidebar-Widgets zu entfernen, das über die function wp_get_sidebars_widgets() wird. Wir verwenden speziell den sidebars_widgets Filter sidebars_widgets .

Es ist wirklich einfach, die Seite, auf der wir uns gerade befinden, zu bestimmen, indem wir einfach die bedingte statement is_single() verwenden.

Um festzustellen, ob unser Widget leer ist oder nicht, ist die Logik ziemlich einfach. Wir benötigen eine Hilfsfunktion, um den Post-Meta-Wert von unserem benutzerdefinierten Feld auf einzelnen Post-Seiten zu erhalten. Diese Hilfsfunktion wird von unserem Widget verwendet, um den Inhalt anzuzeigen. Nun kann diese Logik verwendet werden, um zu bestimmen, ob unser Widget leer ist oder nicht, und dementsprechend können wir das Widget aus der wp_get_sidebars_widgets() verstecken / entfernen, die von functionen wie is_active_sidebar()

Das Problem bezüglich der vollen Breite gegenüber der normalen Anzeige gemäß dem Status einer Seitenleiste ist ziemlich einfach, und ich werde hier nicht genau darauf eingehen. Kurz gesagt, wenn Sie sich das Thema body_class ansehen, verwendet es body_class es, um eine CSS-class full-width wenn die Inhaltsseitenleiste ( sidebar-2 ) leer ist. Dies bedeutet, dass der Inhaltsbereich auf 100% Breite eingestellt ist ( wenn Sie es so nennen möchten ), um das Leerzeichen auf der rechten Seite des Inhalts auszublenden, wenn sich in der Seitenleiste keine Widgets befinden.

Hier ist der Abschnitt verantwortlich dafür

 function twentyfourteen_body_classes( $classes ) { /* ...................*/ if ( ( ! is_active_sidebar( 'sidebar-2' ) ) || is_page_template( 'page-templates/full-width.php' ) || is_page_template( 'page-templates/contributors.php' ) || is_attachment() ) { $classes[] = 'full-width'; } /* ...................*/ return $classes; } add_filter( 'body_class', 'twentyfourteen_body_classes' ); 

Sie können in Ihrer eigenen Zeit einen Blick auf das CSS casting, das verwendet wird, um mit einer Seitenleiste zwischen der vollen Breite und der normalen Ansicht zu wechseln, und Sie sollten mit den Möglichkeiten herumspielen

DER CODE:

HELFER FUNKTION get_custom_field_content

Wir schreiben zuerst unsere Hilfsfunktion, um den benutzerdefinierten Inhalt aus dem benutzerdefinierten Feld aus dem Post in der Einzelansicht zurückzugeben. Ich habe den Code kommentiert, so dass es einfach zu folgen ist

 function get_custom_field_content( $key = '' ) { // Make sure this is a singel page, if not, return false if ( !is_single() ) return false; // Make sure we have a custom field key value, if not, return false if ( !$key ) return false; // We have made it this far, so let sanitize the $key input $key = filter_var( $key, FILTER_SANITIZE_STRING ); // OK, we've come this far, all our conditions checked out, lets get the current post ID $current_post_ID = get_queried_object_id(); // Lets us now get and return our custom post meta value $custom_content = get_post_meta( $current_post_ID, // Current post ID to get post meta from $key, // Custom field to get value from true // Return single value ); return $custom_content; } 

Diese function wird in unserem Widget verwendet, um den benutzerdefinierten Inhalt zu erhalten und dann anzuzeigen. Der $key in der function ist der Name des benutzerdefinierten Felds, in unserem Beispiel custom_content . Diese function wird auch von unserer Filterfunktion verwendet, um festzustellen, ob unser Widget leer ist, und um unser Widget aus unseren Sidebars in einer bedingten statement zu entfernen

DER WIDGET:

Dieses Widget enthält ein Feld, in das Sie den benutzerdefinierten Feldnamen im angegebenen Feld eingeben müssen. Auch hier wird der Code kommentiert, damit er leicht zu befolgen ist

 /** * RelatedContentWidget widget class * * Displays posts from a selected category * * @since 1.0.0 */ class RelatedContentWidget extends WP_Widget { public function __construct() { parent::__construct( 'widget_related_content', _x( 'Related Content Widget', 'Related Content Widget' ), [ 'description' => __( 'Display a list of related content.' ) ] ); $this->alt_option_name = 'widget_related_content'; add_action( 'save_post', [$this, 'flush_widget_cache'] ); add_action( 'deleted_post', [$this, 'flush_widget_cache'] ); add_action( 'switch_theme', [$this, 'flush_widget_cache'] ); } public function widget( $args, $instance ) { $cache = []; if ( ! $this->is_preview() ) { $cache = wp_cache_get( 'widget_rel_content', 'widget' ); } if ( ! is_array( $cache ) ) { $cache = []; } if ( ! isset( $args['widget_id'] ) ) { $args['widget_id'] = $this->id; } if ( isset( $cache[ $args['widget_id'] ] ) ) { echo $cache[ $args['widget_id'] ]; return; } ob_start(); $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Related Content' ); /** This filter is documented in wp-includes/default-widgets.php */ $title = apply_filters( 'widget_title', $title, $instance, $this->id_base ); // This holds the custom field key that holds the custom content $custom_field_key = ( ! empty( $instance['custom_field_key'] ) ) ? $instance['custom_field_key'] : ''; /** * Make sure we only run this on a singular page/single post. * Also make sure that we have a value inside $custom_field_key */ if ( $custom_field_key && is_single() ) { /** * Get the custom field having our custom content * First make sure that the custom function get_custom_field_content() exists to avoid fatal errors */ if ( function_exists( 'get_custom_field_content' ) ) { $custom_content = get_custom_field_content( $custom_field_key // The custom field we need to retrieve content from ); // Make sure we actually have a value before we display anything if ( $custom_content ) { echo $args['before_widget']; if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } // Display our current content echo $custom_content; echo $args['after_widget']; } } } if ( ! $this->is_preview() ) { $cache[ $args['widget_id'] ] = ob_get_flush(); wp_cache_set( 'widget_rel_content', $cache, 'widget' ); } else { ob_end_flush(); } } public function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = filter_var( $new_instance['title'], FILTER_SANITIZE_STRING ); $instance['custom_field_key'] = filter_var( $new_instance['custom_field_key'], FILTER_SANITIZE_STRING ); $this->flush_widget_cache(); $alloptions = wp_cache_get( 'alloptions', 'options' ); if ( isset($alloptions['widget_related_content']) ) delete_option('widget_related_content'); return $instance; } public function flush_widget_cache() { wp_cache_delete('widget_rel_content', 'widget'); } public function form( $instance ) { $title = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : ''; $custom_field_key = isset( $instance['custom_field_key'] ) ? esc_attr( $instance['custom_field_key'] ) : ''; ?> 

< ?php } } add_action( 'widgets_init', function () { register_widget( 'RelatedContentWidget' ); });

So sieht unser Widget im Backend aus

Bildbeschreibung hier eingeben

Filterfunktion:

Schließlich ist unsere Hilfsfunktion, um das Widget auf allen Seiten außer einzelnen Post-Seiten und wenn das Widget leer ist zu entfernen. Auch hier wird der Code kommentiert, damit er leicht zu befolgen ist

 add_filter( 'sidebars_widgets', function ( $sidebars_widgets ) { // Return our filter when we are on admin screen if ( is_admin() ) return $sidebars_widgets; // Widget we need to target. This should be the name/id we used to register it, in this case widget_related_content $custom_widget = 'widget_related_content'; // Set our custom field key to get our custom content $custom_field_key = 'custom_content'; // Be sure to change this to your exact name /** * Only run the next block for all templates/pages except the single page. You can * adjust this as needed. * * We also want to run this on a single page if our custom widget is empty */ // Set a variable to test for single pages $single_post = false; // Set variable to hold the custom content $custom_content = ''; /** * Check for a single page and if it is, check if we have custom content * We will use the custom function we have created, get_custom_field_content() * to run this conditions */ if ( is_single() ) { if ( function_exists( 'get_custom_field_content' ) ) $custom_content = get_custom_field_content( $custom_field_key ); $single_post = true; } // Stop and return $sidebars_widgets if we are on a single page and have custom content if ( $single_post && $custom_content ) return $sidebars_widgets; // We have come this far, let us wrap this up // See if our custom content widget exists is any sidebar, if so, get the array index foreach ( $sidebars_widgets as $sidebars_key=>$sidebars_widget ) { // Skip the wp_inactive_widgets set, we do not need them if ( $sidebars_key == 'wp_inactive_widgets' ) continue; // Only continue our operation if $sidebars_widget are not an empty array if ( $sidebars_widget ) { foreach ( $sidebars_widget as $k=>$v ) { /** * Look for our custom widget, if found, unset it from the $sidebars_widgets array * @see stripos() */ if ( stripos( $v, $custom_widget ) !== false ) unset( $sidebars_widgets[$sidebars_key][$k] ); } // endforeach $sidebars_widget } // endif $sidebars_widget } // endforeach $sidebars_widgets return $sidebars_widgets; }); 

Und das ist alles was wir brauchen. Unter Verwendung des Themas twentyfourteen werden Sie sehen, wenn Sie benutzerdefinierte Inhalte haben

Bildbeschreibung hier eingeben

und hier ist ein Post ohne benutzerdefinierten Inhalt

Bildbeschreibung hier eingeben

EDIT- diese Antwort ist alt, es gibt bessere Möglichkeiten.

ein paar Plugins – Pods , magische Felder , benutzerdefinierte Felder Vorlage .

oder Sie können DIY mit einigen Meta-Boxen und Tinymce-Editoren, siehe diese Antwort .

Dies ist etwas, was ich auf der Ebene der Designvorlagen behandeln würde. Sie erwähnen, dass die Person, die in den Inhalt eintritt, beides tun muss, also nehme ich an, dass der Schreiber beide auf demselben Posten einträgt.

Am Backend würde ich das Plugin Advanced Custom Fields installieren. Dies dient nur dazu, Ihnen die Kopfschmerzen zu ersparen, wenn Sie versuchen, eine benutzerdefinierte WYSIWYG-Feldoption für die Seitenleiste hinzuzufügen. Es ist ein relativ unkomplizierter process, um dies zu erstellen und erlaubt sogar einige Regeln, die es sehr angepasst machen.

In der Vorlagendatei content.php für diesen Post-Typ würden Sie den folgenden Code verwenden:

 < ?php if (have_posts()) : ?> < ?php while (have_posts()) : ?> 
// Your Post Code Here
< ?php endwhile; ?> < ?php endif; ?>

Was dieser Code innerhalb des Artikel-Tags tun wird, da Sie angeben, dass sein Inhalt direkt mit dem Hauptinhalt zusammenhängt, erstellen Sie eine Beilage innerhalb des Artikels, gehen Sie in die Tabelle _postmeta mit der ID des aktuellen Beitrags und suchen Sie den Schlüssel ‘sidebar_content’ (This ist ein Name, den Sie das Feld in ACF geben).

Die Anforderung ist unklar: Müssen Content-Editoren NUR innerhalb des Post-Contents neue Spalten erstellen? Oder ist es in Ordnung, den Post-Inhalt als 3/4-Spalte zu verwenden und dann ein Sidebar-Widget zu bearbeiten, das die 1/4-Spalte erstellt?

Wenn es Letzteres ist – was Sie am Ende mit “Gibt es etwas, was mir erlauben würde, einen Widgets WYSIWYG-Editor hinzufügen?” – Dann ist die Antwort einfach: Installieren Sie einfach WYSIWYG Editor-Widget (s) in Ihrer Seitenleiste und lassen Sie Ihre Mitarbeiter dort Inhalte bearbeiten. WP Editor Widget sieht wie ein gut unterstütztes Plugin aus, das genau das tut.