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.
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.
- Installieren Sie das Plugin
- Erstellen Sie ein Optionsfeld mit den Optionen aktivieren/deaktivieren
- Beschränken Sie die Benutzerrolle, die das Optionsfeldfeld sehen kann
- Fügen Sie den Layouts eine Konditionierung hinzu, damit sie nur angezeigt werden, wenn das entsprechende Optionsfeld aktiviert ist
- 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:
- Erstellen Sie die Optionsseite und beschränken Sie die Ansicht auf den Superadministrator
- Fügen Sie der Optionsseite Kontrollkästchen zum Deaktivieren/Aktivieren hinzu
- Stellen Sie eine Verbindung zur Dropdown-Liste für flexible Felder her
- Führen Sie die if-Anweisung aus, um das Entfernen aus dem Array php auf dem Kontrollkästchenwert = deaktivieren auszuführen
- Aktualisieren Sie das Dropdown-Menü für flexible Felder
- 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.