WordPress SEO von Yoast: Verstecke Meta-Boxen in Posts für Nicht-Administratoren

9

Ich habe eine Website mit mehreren Autoren und bin nicht sehr zufrieden damit, dass alle Mitglieder SEO-Details in die von ihnen veröffentlichten Beiträge eingeben können. Ich möchte, dass dies nur für den Administrator der Website sichtbar ist. Irgendwelche Ideen?

Audrius
quelle

Antworten:

19

In den API-Dokumenten auf der Yoast SEO-Plugin-Site wurde nicht angegeben, was das IDwar, und ich habe keine Kopie von Yoast zur Verfügung, aber gemäß yoas-plugin-dir/admin/class-metabox.phpZeile 144 ist die registrierte meta_box;

add_meta_box( 'wpseo_meta', ...etc ); ...

Welches an add_meta_boxesHaken in Zeile 32 der gleichen Datei angeschlossen ist,

add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );

Natürlich können Sie die ID aus der Meta-Box selbst auf dem Post-Edit-Bildschirm abrufen ... Wie auch immer.

Sie können Folgendes tun:

add_action('add_meta_boxes', 'yoast_is_toast', 99);
function yoast_is_toast(){
    //capability of 'manage_plugins' equals admin, therefore if NOT administrator
    //hide the meta box from all other roles on the following 'post_type' 
    //such as post, page, custom_post_type, etc
    if (!current_user_can('activate_plugins')) {
        remove_meta_box('wpseo_meta', 'post_type', 'normal');
    }
}

... wobei der Beitragstyp der Beitragstyp ist, für den Sie diese Einschränkung ebenfalls anwenden möchten, z. B. postein benutzerdefinierter Beitragstyp, einen oder mehrere!

Sollte den Trick machen.

Update: manage_pluginshätte activate_pluginsgeändert werden sollen.

Adam
quelle
16
+1 für yoast_is_toast().
Kaiser
@Ahmad M, danke für die vorgeschlagene Bearbeitung, aber der $post_typeParameter var und action argument ist in dieser Instanz nicht erforderlich und löst keine Benachrichtigung / Fehler aus. Wenn Sie $post_typevar einschließen , müssen Sie den Beitragstyp in der Funktion an einer anderen Stelle definieren, was Sie nicht getan haben. Der Benutzer hätte dies also ausgeführt, damit er nicht ordnungsgemäß funktioniert. In diesem Fall ist es durchaus akzeptabel, den Namen des Beitragstyps, dh als 'post'direkt in die remove_meta_boxFunktion, zu übergeben. Trotzdem danke für den Vorschlag.
Adam
@userabuser: Vielen Dank für die Klarstellung, ist aber $post_typebereits definiert und bereit, von den add_meta_boxesAction-Hook-Funktionen verwendet zu werden. Weitere Informationen finden Sie in der Ansicht von Adam Brown über diesen Action-Hook. Wenn Sie $post_typein diesem Fall verwenden, wird der Code unabhängig vom post_typeBearbeitungsbildschirm. Dies bedeutet, dass die wpseo_metaMeta-Box aus allen Beitragstypen entfernt wird, auf denen sie gefunden wurde, und nichts zurückgegeben wird, falls sie wpseo_metanicht gefunden wird.
Ahmad M
@ AhmadM Danke Kumpel. Mir ist bekannt, dass die Variable bereits definiert ist, dies macht es jedoch nicht erforderlich, in den Hook / die Funktion überzugehen. In diesem Fall möchte das OP die Meta-Box aus dem postpost_type entfernen, weshalb die ursprüngliche Lösung eine granulare Steuerung ermöglicht. Wenn Sie es jedoch für alle Beitragstypen entfernen möchten, ist die Verwendung der bereits definierten Variable $post_typezufriedenstellend. Ich werde meine Antwort so bearbeiten, dass sie Ihr zusätzliches Beispiel enthält. Verwenden Sie dazu die $post_typeVariable für Situationen, in denen jemand dies auf alle registrierten post_types anwenden möchte.
Adam
5

Versuchen Sie, dies functions.phpgemäß dem WordPress SEO-Plugin ( API Docs ) von Yoast in eine Plugin- oder Themendatei einzufügen .

if(function_exists('wpseo_use_page_analysis') && !current_user_can('administrator')){
    add_filter('wpseo_use_page_analysis', '__return_false');
}

Um Fehler zu vermeiden ... Hiermit wird überprüft, ob die Funktion vorhanden ist, bevor versucht wird, Inhalte auszublenden. So können Sie das Plugin deaktivieren und keine Fehler auslösen.

Möglicherweise müssen Sie sich einhängen, initdamit dies ordnungsgemäß funktioniert. Dies kann folgendermaßen erfolgen:

function wpse_init(){
    if(function_exists('wpseo_use_page_analysis') && !current_user_can('administrator')){
        add_filter('wpseo_use_page_analysis', '__return_false');
    }   
}
add_action('init', 'wpse_init');
Michael Ecklund
quelle
4

Sie können es mit dem entfernen Funktion remove_meta_box .

if ( ! current_user_can( 'edit_pages' ) ) {
    add_action( 'add_meta_boxes', 'my_remove_wp_seo_meta_box', 100000 );
}

function my_remove_wp_seo_meta_box() {
    remove_meta_box( 'wpseo_meta', 'post', 'normal' );
}

Beachten Sie die 100000 in der add_action. Dadurch wird sichergestellt, dass dies erfolgt, nachdem die WP SEO-Metabox eingebunden wurde.

Kid Slimmer
quelle
2

Sie können das Adminimize-Plugin verwenden, um Elemente abhängig von ihren Rollen vor Benutzern auszublenden. Ich habe dies selbst verwendet, um einige Yoast-SEO-Dinge vor Kunden zu verbergen und das Back-End zu vereinfachen.

http://wordpress.org/extend/plugins/adminimize/

Ziemlich einfach zu verwenden, indem Sie die CSS-Selektoren für die Elemente hinzufügen, die Sie ausblenden möchten. Habe es verwendet, um die Registerkarten für die SEO-Seitenanalyse (#linkdex) auszublenden.

noelmcg
quelle
0

Nun, es gibt eine Einstellungsoption für WordPress SEO von Yoast, mit der der erweiterte Teil der WordPress SEO-Einstellungen für Nicht-Administratoren deaktiviert werden kann. Wenn Sie die Box vollständig deaktivieren möchten, können Sie andere Plugins verwenden, um Seitenelemente des Post-Editors für Nicht-Administratoren zu entfernen, z. B. das Entfernen der WordPress-SEO-Box aus dem Post-Editor für Nicht-Administratoren.

user36226
quelle