Verfügbare flexible ACF-Layoutoptionen auflisten

Lesezeit: 12 Minuten

Ich arbeite daran, ein Einstellungssystem für eine WordPress-Installation zu erstellen, in dem Superadministratoren einige Layouts für flexible ACF-Inhalte deaktivieren können, wenn sie für die aktuelle Website nicht benötigt werden, ohne die Struktur des Plugins zu ändern.

Ich suche nach einer Möglichkeit, alle verfügbaren flexiblen ACF-Inhaltslayouts auf einer neuen Admin-Seite aufzulisten.

Nachdem ich die Ordner des Plugins durchgesehen habe, habe ich den folgenden Code darin gefunden class-acf-field-flexible-content.php:

<script type="text-html" class="tmpl-popup"><?php 
    ?><div class="acf-fc-popup"><ul><?php foreach( $layouts as $layout ): 

        $atts = array(
            'href'            => '#',
            'data-layout'    => $layout['name'],
            'data-min'         => $layout['min'],
            'data-max'         => $layout['max'],
        );

        ?><li><a <?php acf_esc_attr_e( $atts ); ?>><?php echo $layout['label']; ?></a></li><?php 

    endforeach; ?></ul></div>
</script>

Dadurch wird eine Liste der verfügbaren Layouts erstellt, die der Client beim Erstellen neuer Posts/Seiten verwenden kann.

Kennt jemand eine einfache Möglichkeit, wie ich eine Reihe von ACF-Layouts in PHP erstellen kann, die ich einfach auf einer anderen Seite im WP Admin anzeigen kann?

Tut mir leid, ich habe nicht wirklich einen Code zum Anzeigen, es ist eine etwas einzigartige Anfrage

Ich habe eine Lösung entwickelt, die auf einer Einstellungsseite alle Namen der flexiblen Inhaltslayouts neben einem Kontrollkästchen anzeigt, in dem Sie die Auswahl aufheben können, welche Layouts aus der Liste entfernt werden, wenn Sie beim Versuch auf die Schaltfläche „Hinzufügen“ klicken füge ein neues Layout hinzu.

Als kurze Einführung habe ich acf-json verwendet, um alle flexiblen Layoutnamen abzurufen, und dann eine weitere JSON-Datei erstellt, die die Namen der Layouts enthält, die ich deaktivieren möchte. Ich führe dann eine Funktion aus, die sich jeden Layoutnamen ansieht, überprüft, ob er nicht in der Deaktivierungsliste enthalten ist, und wenn dies der Fall ist, wird er entfernt.

Zunächst habe ich das lokale JSON innerhalb von ACF initialisiert. Befolgen Sie dazu die Schritte auf https://www.advancedcustomfields.com/resources/local-json/.

Ich habe dann eine neue Einstellungsseite erstellt functions.php:

<?php
function add_theme_menu_item()
{
    add_options_page("Flexible Layouts", "Flexible Layouts", "manage_options", "flexible-layouts", "theme_settings_page", null, 99);
}

add_action("admin_menu", "add_theme_menu_item");
?>

Innerhalb der theme_settings_page -Funktion müssten Sie den JSON für die flexible Inhaltsgruppe dekodieren:

<?php
$jsonURL = get_template_directory_uri(). "/acf-json/flexible_content_group.json";
$contents = file_get_contents("{$jsonURL}");
$data =  json_decode($contents);
?>

Ich habe dann dasselbe mit einer JSON-Datei gemacht, die alle deaktivierten Felder enthalten würde (ich werde in Kürze erklären, wie diese Datei erstellt wird):

<?php
$jsonDisabledFieldsURL = get_template_directory_uri(). "/acf-json/disabledFields.json";
$disabledFieldsContents = file_get_contents("{$jsonDisabledFieldsURL}");
$disabledFieldsData =  json_decode($disabledFieldsContents);
?>

Ich habe dann alle Layoutnamen in ein Array verschoben $availableOptions:

<?php
$availableOptions = [];
foreach($data->fields as $field) {
    foreach($field->layouts as $layout) {
        array_push($availableOptions, $layout->name);
    }
}
?>

Wir brauchen also eine Liste aller Felder mit Checkboxen und einem Submit-Button. Mit der Schaltfläche „Senden“ habe ich Ajax verwendet, um die deaktivierten Felder zu posten, die ich in einem Array platziert habe:

<script type="text/javascript" src="https://stackoverflow.com/questions/48185529/<?php echo get_template_directory_uri(); ?>/js/lib/sweetalert2.js"></script>
<script>
    jQuery('.submit_json_handler').click(function(e){
        e.preventDefault();
        var self = jQuery(this);
        var array = [];

        jQuery('input:checkbox:not(:checked)').each(function() {
            array.push(jQuery(this).val());
        });

        jQuery.ajax({
            type:'POST',
            url:'<?php echo get_template_directory_uri(); ?>/acf-json/custom_json_handler.php',
            data: {
                'disabled_fields' : array
            },
            success:function(data){
                console.log(data);
                swal(
                  'Success!',
                  'The active layouts have now been updated.',
                  'success'
                )
            }
        });
    });
</script>

Ich habe das SweetAlert2-Plugin verwendet (https://sweetalert2.github.io/), um eine Erfolgsmeldung zu verarbeiten, wenn sich die Felder geändert haben.

Mein Code für die custom_json_handler.php ruft die geposteten deaktivierten Felder ab und schiebt sie in ein Array. Das Array wird dann in die zuvor erwähnte JSON-Datei codiert (disabledFields.json):

<?php
    $disabledFields = $_POST['disabled_fields'];
    $disabledFieldsArray = [];

    try {   

        foreach($disabledFields as $field) {
            array_push($disabledFieldsArray, $field); 
        }

        $fp = fopen($_SERVER['DOCUMENT_ROOT']."/wp-content/themes/pblite-theme/acf-json/disabledFields.json","wb");
        fwrite($fp,json_encode($disabledFieldsArray));
        fclose($fp);

    }
    catch(Exception $e) {
        return $e;
    }

    echo "Success!";
?>

Das letzte Teil des Puzzles innerhalb der Funktion theme_settings_page besteht darin, das Formular zu erstellen, das alle Layouts anzeigt, mit Kontrollkästchen daneben, die basierend auf den ausgewählten deaktivierten Feldern aktiviert/deaktiviert werden können:

<?php
$activeLayouts = array_diff($availableOptions, $disabledFieldsData);

echo "<form action=\"post\">";
echo "<table>";
foreach($data->fields as $field) {

    foreach($field->layouts as $layout) {

        if(in_array($layout->name, $activeLayouts)) {
            $checked = "checked";
        } else {
            $checked = "";
        }

        echo "<tr><td><input type=\"checkbox\" {$checked} name=\"disabled_flexible_layouts[]\" value=\"{$layout->name}\" /></td><td>{$layout->label}</td></tr>";

    }

}

echo "</table>";
echo "<p class=\"submit\"><input type=\"button\" value=\"Submit\" name=\"submit\" class=\"button button-primary submit_json_handler\" /></p>";
echo "</form>";
?>

Dadurch erhalten Sie Ihre Liste der Layouts, in denen deaktivierte Felder deaktiviert sind.

Zuletzt musste ich die deaktivierten Felder JSON verwenden, um die Listenelemente innerhalb der Schaltfläche „Hinzufügen“ auf einer Seite zu entfernen, auf der Sie ein Layout auswählen. Dazu habe ich eine weitere Funktion innerhalb erstellt functions.php das hakt in die acf/input/admin_head (damit die Funktion Spaß macht, wenn ACF vorhanden ist):

<?php

function acf_admin_head_layout( $field ) {

?>

<script type="text/javascript">

    (function($) {

        $(document).ready(function(){

            $.get('<?php echo get_template_directory_uri(); ?>/acf-json/disabledFields.json', function(data) {

            // alert(data);
                $.each(data, function(i, item) {

                    tmpl = $('.tmpl-popup').html();

                    //Create jQuery object
                    tmplDiv = $('<div>', {html : tmpl});

                    //Target element and remove it
                    tmplDiv.find('a[data-layout="'+item+'"]').closest('li').remove();

                    tmpl = tmplDiv.html();

                    $('.tmpl-popup').replaceWith('<script type="text-html" class="tmpl-popup">'+tmpl+'</sc'+'ript>');

                });

            });                   

        });

    })(jQuery);  

</script>  

<?php

}

add_action('acf/input/admin_head', 'acf_admin_head_layout', 10, 1);

?>

Dadurch wird die Klasse auf der Seite gefunden, in der sich die Zeichenfolge befindet, die die Layoutoptionen enthält, diese in HTML konvertiert, sodass wir den Inhalt bearbeiten und in einer temporären Variablen speichern können. Wir durchlaufen dann jedes der deaktivierten Felder, die in der JSON-Datei vorhanden waren, und versuchen, eine Übereinstimmung innerhalb des data-layout-Attributs zu finden, und wenn es eine Übereinstimmung gibt, wird das Schranklistenelement (sein übergeordnetes Element) entfernt.

Wir müssen dann die wieder hinzufügen <script> -Tags und fügen Sie sie wieder in die Seite ein, sodass die neu bereinigte Liste anstelle der alten verwendet wird.

Sobald dies alles erledigt ist, sollten Sie einen Bereich in Ihrem Einstellungsmenü haben, in dem Sie alle Ihre Layouts haben, die Sie aktivieren/deaktivieren können. Sie sollten dann in der Lage sein, eine Seite hinzuzufügen/zu bearbeiten und die auszuwählen Add Schaltfläche und Sie sollten nur die Layouts sehen, die Sie auf der Einstellungsseite ausgewählt haben.

  • Dies scheint viel mehr Arbeit zu sein, als für die einfache Verarbeitung erforderlich ist. Sie könnten Layouts auf einer Einstellungsseite einfach Kontrollkästchen hinzufügen. Führen Sie ein Skript aus, um zu sehen, was der Wert ist, und fügen Sie dann CSS-Felder zum Ausblenden und Anzeigen im Admin-Bereich hinzu. Sie könnten auch die Checkboxen verwenden und das acf update_field(); um alle Optionen für dieses Layout zu aktualisieren. Vieles davon erscheint unnötig.

    – Daniel Vickers

    17. Januar 2018 um 10:50 Uhr

  • Während Sie vielleicht das Gefühl haben, dass dies für etwas, das ein „einfacher“ Prozess sein sollte, komplex ist, funktionieren Theorie und Ausführung genau für die gestellte Frage. Durch die Verwendung von acf-json werden beim Erstellen/Entfernen eines Layouts die flexiblen Layouts auf der Einstellungsseite automatisch aktualisiert, da die JSON-Datei automatisch aktualisiert würde und es nicht erforderlich ist, etwas mit CSS zu verbergen. Die Verwendung von CSS zum Ausblenden von Elementen, um etwas vom Benutzer zu entfernen, kann ausgenutzt werden. Um die Liste der Schaltfläche „Hinzufügen“ mit Ihrer Lösung zu ändern, müssten Sie trotzdem die meisten der von mir erstellten Funktionen durchlaufen.

    – M. Ferguson

    17. Januar 2018 um 11:07 Uhr

  • Als ich seine Screenshots überprüfte, sah ich nicht, dass er flexible Inhalte verwendete, von denen das einzige ist, was die Schaltfläche „Hinzufügen“ verwendet, um eine Liste von Blöcken zur Auswahl anzuzeigen. Nach meinem Verständnis werden die Layouts auf dieser Seite nur als normale Blöcke angezeigt, was bedeutet, dass es ausreicht, den Block einfach zu zerstören oder auszublenden, ohne dass eine Verbindung zu einer Liste mit Schaltflächen zum Hinzufügen hergestellt werden muss. Was bereits einen Großteil Ihres Codes überflüssig macht.

    – Daniel Vickers

    17. Januar 2018 um 11:22 Uhr


  • „Ich arbeite daran, ein Einstellungssystem für eine WordPress-Installation zu erstellen, in dem Superadministratoren einige Layouts für flexible ACF-Inhalte deaktivieren können, wenn sie für die aktuelle Website nicht benötigt werden, ohne die Struktur des Plugins zu ändern.“ In der Frage steht, dass er eine Liste aller Layouts haben möchte, die in der Flexible Content-Gruppe erscheinen. Es tut mir leid, dass Sie das Gefühl haben, dass ein Großteil meines Codes unnötig ist, und sich darüber beleidigt fühlen, aber der von mir geschriebene Code funktioniert für die gestellte Frage.

    – M. Ferguson

    17. Januar 2018 um 11:38 Uhr

  • Wie auch immer, ich versuche nicht, Anstoß zu erregen oder Anstoß zu nehmen, aber es scheint, dass Abschnitte nicht benötigt werden, wenn es funktioniert, funktioniert es.

    – Daniel Vickers

    17. Januar 2018 um 11:43 Uhr

Benutzer-Avatar
Daniel Vickers

Also, wonach Sie anscheinend suchen, ist Folgendes:

  • Die Website des Kunden verfügt über ein benutzerdefiniertes Feld, das mehrere Optionen auflistet, die er auswählen kann, um das Seitenlayout zu ändern (ähnlich wie eine Vorlage).
  • Sie möchten in der Lage sein, bestimmte Layouts für bestimmte Kunden-Websites zu deaktivieren, ohne das benutzerdefinierte Feld und/oder den Plugin-Code zu bearbeiten.

Meine Antwort darauf wäre, die zu verwenden ACF-Benutzerrollen-Plugin und begrenzen Sie die Konten, die bestimmte Felder sehen können, dh beschränken Sie die Felder nur auf Ihre Benutzerrolle, sodass nur Sie darauf Zugriff haben (möglicherweise müssen Sie eine neue Benutzerrolle erstellen, wenn sie dieselbe Rolle wie Sie haben).

Sie möchten dann Ihren aktuellen benutzerdefinierten Feldern einen weiteren Abschnitt für jedes Layout hinzufügen, bei dem es sich um ein Optionsfeld handelt, das so etwas wie “Aktivieren” und “Deaktivieren” anzeigt. Und dann möchten Sie Ihre Layoutfelder so bearbeiten, dass sie eine bedingte Formatierung haben, bei der der Wert dieses Felds überprüft wird, und wenn er nicht gleich aktiviert ist, wird er nicht angezeigt.

  1. Installieren Sie das Plugin
  2. Erstellen Sie ein Optionsfeld mit den Optionen aktivieren/deaktivieren
  3. Beschränken Sie die Benutzerrolle, die das Optionsfeldfeld sehen kann
  4. Fügen Sie den Layouts eine Konditionierung hinzu, damit sie nur angezeigt werden, wenn das entsprechende Optionsfeld aktiviert ist
  5. Aktivieren / Deaktivieren Sie die Layouts, die nicht angezeigt werden sollen

Zusätzliche Schritte – Möglicherweise müssen Sie für diese Methode eine weitere Benutzerrolle erstellen, wenn sie dieselbe Rolle teilen.

Es gibt mehrere Plugins, die Sie verwenden können. Suchen Sie einfach nach einer neuen Benutzerrolle in WordPress. Alles, was Sie tun müssen, ist, ihm genau die gleichen Berechtigungen wie Ihrer Rolle zu erteilen, aber Sie können eine Rolle auswählen, die nur für Sie gilt, damit sie das Feld nicht sehen können.

Ich hoffe, das hilft, wenn nicht, kann ich es weiter erläutern.

OPTION 2:

  1. Erstellen Sie die Optionsseite und beschränken Sie die Ansicht auf den Superadministrator
  2. Fügen Sie der Optionsseite Kontrollkästchen zum Deaktivieren/Aktivieren hinzu
  3. Stellen Sie eine Verbindung zur Dropdown-Liste für flexible Felder her
  4. Führen Sie die if-Anweisung aus, um das Entfernen aus dem Array php auf dem Kontrollkästchenwert = deaktivieren auszuführen
  5. Aktualisieren Sie das Dropdown-Menü für flexible Felder
  6. Fertig

Da Sie mit der anderen Antwort zufrieden sind, werde ich den Code dafür nicht durchgehen, es wäre ähnlich, nur abzüglich des JSON-Teils und der Erfolgsmeldung.

  • Dies ist ein kluger Ansatz, wenn ich am Montag wieder im Büro bin, werden wir es versuchen und ich werde Sie über das Ergebnis informieren. Prost, Mann

    – Andy Holmes

    13. Januar 2018 um 0:06 Uhr

  • Danke @Daniel. Ich habe ein Layout erstellt, in dem alle Felder bedingt sind, basierend auf einem Optionsfeld von Aktiviert / Deaktiviert. Ich habe ein Nachrichtenfeld erstellt, wenn das Optionsfeld deaktiviert ist. Wenn also das Layout ausgewählt ist, wird einem Editor nur eine Meldung angezeigt, dass das Layout deaktiviert wurde. Das Problem ist, wenn Sie das Optionsfeld im Editor ausblenden, sieht es so aus wie die bedingten Arbeitsunterbrechungen, da ich das Feld nicht sehen kann, das angezeigt werden sollte, wenn es deaktiviert ist (ich habe den Standardwert für diesen Test auf deaktiviert gesetzt). Vielen Dank.

    – M. Ferguson

    15. Januar 2018 um 11:07 Uhr

  • Hallo, können Sie mir bitte ein Bild zur Verfügung stellen, damit ich Ihre Felder überprüfen kann, um sicherzustellen, dass sie alle richtig konfiguriert sind (manchmal übersehen wir Kleinigkeiten).

    – Daniel Vickers

    15. Januar 2018 um 13:13 Uhr

  • Hier können Sie eine ZIP-Datei meiner Bilder herunterladen: Verknüpfung. Sie werden sehen, dass ich Ihnen das Optionsfeld Aktivieren/Deaktivieren gezeigt habe, meine Meldung, die erscheinen sollte, wenn das Optionsfeld deaktiviert ist, und alle anderen Felder, die angezeigt werden (diese wurden alle auf gesetzt, wenn das Optionsfeld Aktiviert auf gesetzt ist Ermöglicht

    – M. Ferguson

    15. Januar 2018 um 14:23 Uhr

  • Hmm, anscheinend sind alle Ihre Felder richtig konfiguriert. Wird der Wert definitiv für das Aktivieren/Deaktivieren festgelegt (es kann sein, dass Sie ihn auswählen und die Seite aktualisieren und sie nicht speichert. Wenn dies der Fall ist, erhöhen Sie die php max input vars).

    – Daniel Vickers

    15. Januar 2018 um 14:44 Uhr

1350470cookie-checkVerfügbare flexible ACF-Layoutoptionen auflisten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy