crear un CPT mayormente de solo lectura

2

Tengo un CPT que obtiene sus datos al leer desde un servidor externo. El servidor externo es el maestro de los datos y mi complemento almacena una replicación sin la capacidad de actualizar el maestro, por lo que la capacidad de editar el contenido solo confundirá al usuario, incluso podría hacerle pensar que el maestro será actualizado por las modificaciones .

Básicamente, deseo reutilizar el marco de administración de CPT, pero solo dejo el enlace de eliminación (tal vez ni siquiera eso), incluso para los administradores.

Probablemente pueda hacerlo con CSS pero buscando otras opciones que me parezcan menos.

Esto es para la estética de la interfaz de usuario y no de la seguridad, por lo que no me importa que sea posible solucionar este problema.

    
pregunta Mark Kaplun 29.11.2013 - 12:13

2 respuestas

3

Hace poco hice algo similar para un simple registro de correo electrónico (para diagnosticar algunos problemas). No tengo tiempo para analizar el código, pero espero que sea lo suficientemente claro para ti.

Crea un CPT para almacenar datos que se pueden ver en el administrador (solo), y permite al usuario ver y eliminar cada publicación. NB: eliminar, no basura, no es necesario resucitar publicaciones eliminadas. Editar se cambia a Ver, y los metaboxes se reemplazan con una plantilla de vista. Obviamente, a este código le faltan los bits que escriben en el CPT y purgan automáticamente los antiguos, pero deberían ser suficientes para su pregunta.

/**
* custom post type for email log
*/
class LogEmailsPostTypeLog {

    /**
    * hooks
    */
    public function __construct() {
        add_action('admin_init', array($this, 'init'));
        add_action('init', array($this, 'register'));
    }

    /**
    * admin_init action
    */
    public function init() {
        global $typenow;

        if (empty($typenow)) {
            // try to pick it up from the query string
            if (!empty($_GET['post'])) {
                $post = get_post($_GET['post']);
                $typenow = $post->post_type;
            }
        }

        if ($typenow == 'log_emails_log') {
            add_filter('display_post_states', '__return_false');
            add_action('edit_form_after_title', array($this, 'adminEditAfterTitle'), 100);
            add_filter('post_row_actions', array($this, 'adminPostRowActions'), 10, 2);
            add_filter('bulk_actions-edit-log_emails_log', array($this, 'adminBulkActionsEdit'));
            add_filter('manage_log_emails_log_posts_columns', array($this, 'adminManageColumns'));
            add_action('manage_log_emails_log_posts_custom_column', array($this, 'adminManageCustomColumn'), 10, 2);
            add_action('admin_print_footer_scripts', array($this, 'adminPrintFooterScripts'));

            add_action('in_admin_header', array($this, 'adminScreenLayout'));
            add_filter('views_edit-log_emails_log', array($this, 'adminViewsEdit'));

            if (is_admin()) {
                add_filter('gettext', array($this, 'adminGetText'), 10, 3);
            }

            wp_enqueue_script('jquery');
        }
    }

    /**
    * register Custom Post Type
    */
    public function register() {
        // register the post type
        register_post_type('log_emails_log', array(
            'labels' => array (
                'name' => __('Email Logs', 'log-emails'),
                'singular_name' => __('Email Log', 'log-emails'),
                'add_new_item' => __('Add New Email Log', 'log-emails'),
                'edit_item' => __('View Email Log', 'log-emails'),
                'new_item' => __('New Email Log', 'log-emails'),
                'view_item' => __('View Email Log', 'log-emails'),
                'search_items' => __('Search Email Log', 'log-emails'),
                'not_found' => __('No email logs found', 'log-emails'),
                'not_found_in_trash' => __('No email logs found in Trash', 'log-emails'),
                'parent_item_colon' => __('Parent email logs', 'log-emails'),
            ),
            'description' => __('Email Logs, as a custom post type', 'log-emails'),
            'exclude_from_search' => true,
            'publicly_queryable' => false,
            'public' => false,
            'show_ui' => true,
            'show_in_admin_bar' => false,
            'menu_position' => 75,
            'hierarchical' => false,
            'has_archive' => false,
            'supports' => array('nada'),
            'rewrite' => false,
            'can_export' => false,
            'capabilities' => array (
                'create_posts' => false,
                'edit_post' => 'manage_options',
                'read_post' => 'manage_options',
                'delete_post' => 'manage_options',
                'edit_posts' => 'manage_options',
                'edit_others_posts' => 'manage_options',
                'publish_posts' => 'manage_options',
                'read_private_posts' => 'manage_options',
            ),
        ));
    }

    /**
    * change some text on admin pages
    * @param string $translation
    * @param string $text
    * @param string $domain
    * @return string
    */
    public function adminGetText($translation, $text, $domain) {
        if ($domain == 'default') {
            if ($text == 'Edit “%s”') {
                $translation = 'View “%s”';
            }
        }

        return $translation;
    }

    /**
    * remove views we don't need from post list
    * @param array $views
    * @return array
    */
    public function adminViewsEdit($views) {
        unset($views['publish']);
        unset($views['draft']);

        return $views;
    }

    /**
    * remove unwanted actions from post list
    * @param array $actions
    * @param WP_Post $post
    * @return array
    */
    public function adminPostRowActions($actions, $post) {
        unset($actions['inline hide-if-no-js']);        // "quick edit"
        unset($actions['trash']);
        unset($actions['edit']);

        if ($post && $post->ID) {
            // add View link
            $actions['view'] = sprintf('<a href="%s" title="%s">%s</a>',
                get_edit_post_link($post->ID),
                __('View', 'log-emails'), __('View', 'log-emails'));

            // add Delete link
            $actions['delete'] = sprintf('<a href="%s" title="%s" class="submitdelete">%s</a>',
                get_delete_post_link($post->ID, '', true),
                __('Delete', 'log-emails'), __('Delete', 'log-emails'));
        }

        return $actions;
    }

    /**
    * change the list of available bulk actions
    * @param array $actions
    * @return array
    */
    public function adminBulkActionsEdit($actions) {
        unset($actions['edit']);

        return $actions;
    }

    /**
    * filter to add columns to post list
    * @param array $posts_columns
    * @return array
    */
    public function adminManageColumns($posts_columns) {
        $posts_columns['title'] = 'Subject';
        $posts_columns['_log_emails_log_to'] = 'Recipients';

        return $posts_columns;
    }

    /**
    * action to add custom columns to post list
    * @param string $column_name
    * @param int $post_id
    */
    public function adminManageCustomColumn($column_name, $post_id) {
        switch ($column_name) {
            case '_log_emails_log_to':
                $post = get_post($post_id);
                if ($post) {
                    echo htmlspecialchars(get_post_meta($post_id, '_log_emails_log_to', true));
                }
                break;
        }
    }

    /**
    * change the screen layout
    */
    public function adminScreenLayout() {
        // set max / default layout as single column
        add_screen_option('layout_columns', array('max' => 1, 'default' => 1));
    }

    /**
    * drop all the metaboxes and output what we want to show
    */
    public function adminEditAfterTitle($post) {
        global $wp_meta_boxes;

        // remove all meta boxes
        $wp_meta_boxes = array('log_emails_log' => array(
            'advanced' => array(),
            'side' => array(),
            'normal' => array(),
        ));

        // show my admin form
        require LOG_EMAILS_PLUGIN_ROOT . 'views/log-detail.php';
    }

    /**
    * replace Trash bulk actions with Delete
    * NB: WP admin already handles the delete action, it just doesn't expose it as a bulk action
    */
    public function adminPrintFooterScripts() {
        ?>

        <script>
        jQuery("select[name='action'],select[name='action2']").find("option[value='trash']").each(function() {
            this.value = 'delete';
            jQuery(this).text("<?php esc_attr_e('Delete', 'log-emails'); ?>");
        });
        </script>

        <?php
    }

}
    
respondido por el webaware 30.11.2013 - 22:59
1

Puedes reemplazar el editor con un meta box de solo lectura.

// use the action to create a place for your meta box
function add_before_editor($post) {
  if ('post' == $post->post_type) {
    remove_post_type_support('post','editor');
    do_meta_boxes('post', 'read_only_content', $post);
  }
}
add_action('edit_form_after_title','add_before_editor');

// add a box the location just created
function read_only_content_box() {
  add_meta_box(
    'read_only_content_box', // id, used as the html id att
    __( 'Post Content (Read Only)' ), // meta box title
    'read_only_cb', // callback function, spits out the content
    'post', // post type or page. This adds to posts only
    'read_only_content', // context, where on the screen
    'low' // priority, where should this go in the context
  );
}
function read_only_cb($post) {
  echo apply_filters('the_content',$post->post_content);
}
add_action( 'add_meta_boxes', 'read_only_content_box' );

Supongo que está deshabilitando la funcionalidad de "guardar" para este tipo de publicación. Si no es así, si necesita algunas partes para guardar el contenido principal, es posible que deba conectarse al proceso del formulario para evitar que alguien lo piratee. Tal como está, el contenido de la publicación no se sobrescribe, pero no sería tan difícil descifrarlo.

Para eliminar completamente la capacidad de edición, use el argumento capability cuando registre su tipo de publicación . Establezca ese argumento en read_post y todo el tipo se convertirá en "solo lectura". También querrá 'show_in_admin_bar' => false, . Ejemplo de matriz de argumentos:

  $args = array(
    'labels'             => $labels,
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'book' ),
    'capability_type'    => 'post',
    'capabilities'       => array('read_post'),
    'show_in_admin_bar'  => false,
    'has_archive'        => true,
    'hierarchical'       => false,
  );
    
respondido por el s_ha_dum 29.11.2013 - 17:39

Lea otras preguntas en las etiquetas