2
0
Fork 0
mirror of https://github.com/discourse/wp-discourse.git synced 2025-08-17 18:11:19 +08:00
wp-discourse/admin/publish-settings.php
Simon Cossar 43bd053450
Bump version to 2.2.4 (#404)
* Add base log classes

* Return maxFiles to normal level

* Use protected class variables for folder names in folder-manager

* Add unit tests for logger classes && various logger improvements

* Add log viewer

* Fix initialization sequence in LogViewer

* Add wp-discourse settings to plugin meta

* Remove metafile comments

* Add partial coverage and annotate LogViewer

* Add code coverage reporting and a tests readme

* Tests readme xdebug section formatting

* Add logging and tests to discourse-publish

This abstracts remote post components to make it possible to add consistent error and log handling. Also adds basic tests coverage for discourse-publish.

* Add successful publication test

* Add working tests for publish_after_create and publish_after_update

* Always remove test files and database upon install

* Cleanup copy and assertions for existing tests

* Final cleanup && verbose setting

* Improve structure of publish test

* Final tests, linting, security and cleanup

* PHP 7.0 Compatibility

* PHP 5.6 Compatibility

* JSHint fixes

* Update file-handler.php

* Update log viewer title

* Use older monolog and update file_handler function signatures

* Add nonce to other view_log action

* Namespace production composer packages and define build process

* Update COMPOSER.md

* Update FORMATTING.md

* Log viewer style, naming and log-refresh improvements

* Filter out all return type declarations during scoping

* JsHint: Don't use default params

* Update COMPOSER.md

* Copy fix

* Update scoper patchers notes

* Address syntax issues

- Remove >php7 syntax from non-required files
- Add phpcs pattern exclusions to phpcs.xml
- update formatting docs

* discourse-publish: address all phpcs notices and add more tests

Note: also added dealerdirect/phpcodesniffer-composer-installer to handle local requiring of codesniffer

* Handle all phpcs warnings in lib/logs

* Add todo: review phpcs exclusions to discourse-publish

* Monolog cleanup

- Remove unused monolog handlers, processors and formatters
- Add vendor_namespaced to excluded phpcs patterns

* Update CI versions to those used in composer

* Switch to using composer directly in CI actions

* Composer is packaged in shivammathur/setup-php

* Setup PHPCS via shivammathur/setup-php

* Incorrect tools key

* Use vendor/bin version of phpcs

* Install composer dependencies via ramsey/composer-install

* Update composer.lock to composer 2 and --ignore-platform-reqs

* Install lowest version of dependencies

* Move dependency-versions key

* Move composer-options key

* Exclude vendor directory from syntax checker

* Add vendor to jshintignore

* Update phpcs.xml to properly exclude js css and config files

* Address phpcs issues in log-viewer

* Fix remaining whitespace issues created in this PR

* Remove out of date sniffs and exclude specific code where necessary

* Final cleanup

* Properly escape html in log viewer

* Remove unnecessary verbiage from documentation

* Bump plugin's version to 2.2.4

Co-authored-by: Angus McLeod <angus@mcleod.org.au>
2021-05-11 15:31:24 -07:00

612 lines
17 KiB
PHP

<?php
/**
* Publishing Settings.
*
* @package WPDiscourse
*/
namespace WPDiscourse\Admin;
use WPDiscourse\Shared\PluginUtilities;
/**
* Class PublishSettings
*/
class PublishSettings {
use PluginUtilities;
/**
* An instance of the FormHelper class.
*
* @access protected
* @var \WPDiscourse\Admin\FormHelper
*/
protected $form_helper;
/**
* Gives access to the plugin options.
*
* @access protected
* @var mixed|void
*/
protected $options;
/**
* Whether or not to use some network publish settings.
*
* @access protected
* @var bool
*/
protected $use_network_publish_settings;
/**
* PublishSettings constructor.
*
* @param \WPDiscourse\Admin\FormHelper $form_helper An instance of the FormHelper class.
*/
public function __construct( $form_helper ) {
$this->form_helper = $form_helper;
add_action( 'admin_init', array( $this, 'register_publish_settings' ) );
}
/**
* Add settings section, settings fields, and register the setting.
*/
public function register_publish_settings() {
$this->options = $this->get_options();
$this->use_network_publish_settings = is_multisite() && ! empty( $this->options['multisite-configuration-enabled'] );
add_settings_section(
'discourse_publishing_settings_section',
__( 'Publishing Settings', 'wp-discourse' ),
array(
$this,
'publishing_settings_tab_details',
),
'discourse_publish'
);
add_settings_field(
'discourse_publish_category',
__( 'Default Discourse Category', 'wp-discourse' ),
array(
$this,
'publish_category_input',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_display_subcategories',
__( 'Display Subcategories', 'wp-discourse' ),
array(
$this,
'display_subcategories',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_publish_category_update',
__( 'Force Category Update', 'wp-discourse' ),
array(
$this,
'publish_category_input_update',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_allow_tags',
__( 'Allow Tags', 'wp-discourse' ),
array(
$this,
'allow_tags_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_max_tags',
__( 'Maximum Number of Tags', 'wp-discourse' ),
array(
$this,
'max_tags_input',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_publish_as_unlisted',
__( 'Publish as Unlisted Topics', 'wp-discourse' ),
array(
$this,
'publish_as_unlisted_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_full_post_content',
__( 'Use Full Post Content', 'wp-discourse' ),
array(
$this,
'full_post_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_custom_excerpt_length',
__( 'Custom Excerpt Length', 'wp-discourse' ),
array(
$this,
'custom_excerpt_length',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_add_featured_link',
__( 'Add Featured Links', 'wp-discourse' ),
array(
$this,
'add_featured_link_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_auto_publish',
__( 'Auto Publish', 'wp-discourse' ),
array(
$this,
'auto_publish_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_force_publish',
__( 'Force Publish', 'wp-discourse' ),
array(
$this,
'force_publish_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_force_publish_max_age',
__( 'Force Publish Max Age', 'wp-discourse' ),
array(
$this,
'force_publish_max_age_input',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_publish_failure_notice',
__( 'Send Email Notification on Publish Failure', 'wp-discourse' ),
array(
$this,
'publish_failure_notice_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_publish_failure_email_address',
__( 'Email Address for Failure Notification', 'wp-discourse' ),
array(
$this,
'publish_failure_email_address',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_auto_track',
__( 'Auto Track Published Topics', 'wp-discourse' ),
array(
$this,
'auto_track_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_allowed_post_types',
__( 'Post Types to Publish', 'wp-discourse' ),
array(
$this,
'post_types_select',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
// These options should be set for the whole network when multi-site support is enabled.
if ( ! $this->use_network_publish_settings ) {
add_settings_field(
'discourse_hide_name_field',
__( 'Do Not Display Discourse Name Field', 'wp-discourse' ),
array(
$this,
'hide_discourse_name_field_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
// Todo: add this setting to network-options.php.
add_settings_field(
'discourse-username_editable',
__( 'Discourse Username Editable', 'wp-discourse' ),
array(
$this,
'discourse_username_editable_checkbox',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_direct_db_publication_flags',
__( 'Direct Database Publication Flags', 'wp-discourse' ),
array(
$this,
'direct_db_publication_flags',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
add_settings_field(
'discourse_verbose_publication_logs',
__( 'Verbose Publication Logging', 'wp-discourse' ),
array(
$this,
'verbose_publication_logs',
),
'discourse_publish',
'discourse_publishing_settings_section'
);
}
register_setting(
'discourse_publish',
'discourse_publish',
array(
$this->form_helper,
'validate_options',
)
);
}
/**
* Outputs markup for the display-subcategories checkbox.
*/
public function display_subcategories() {
$this->form_helper->checkbox_input(
'display-subcategories',
'discourse_publish',
__( 'Include subcategories in the list of available categories.', 'wp-discourse' ),
__( "You need to select and save both this setting and the 'Force Category Update' setting before subcategories will be available in the category list.", 'wp-discourse' )
);
}
/**
* Outputs markup for the publish-category input.
*/
public function publish_category_input() {
$this->form_helper->category_select(
'publish-category',
'discourse_publish',
__(
"The default category in which
your posts will be published on Discourse. (This can be changed in the 'Publish to Discourse' meta-box when you create a post.)",
'wp-discourse'
)
);
}
/**
* Outputs markup for the allow-tags checkbox.
*/
public function allow_tags_checkbox() {
$this->form_helper->checkbox_input(
'allow-tags',
'discourse_publish',
__( 'Allow post authors to add tags to Discourse topic.', 'wp-discourse' )
);
}
/**
* Outputs markup for the max-tags input.
*/
public function max_tags_input() {
$this->form_helper->input( 'max-tags', 'discourse_publish', __( 'The maximum number of tags to allow.', 'wp-discourse' ), 'number', 0 );
}
/**
* Outputs markup for publish-as-unlisted checkbox.
*/
public function publish_as_unlisted_checkbox() {
$this->form_helper->checkbox_input(
'publish-as-unlisted',
'discourse_publish',
__( 'Publish posts as unlisted Discourse topics.', 'wp-discourse' ),
__( 'If you have enabled the Sync Comment Data webhook, topics will be listed when they receive a comment.', 'wp-discourse' )
);
}
/**
* Outputs markup for the publish-category-update input.
*/
public function publish_category_input_update() {
// Only set the force_update option for a single request.
$discourse_publish = get_option( 'discourse_publish' );
$discourse_publish['publish-category-update'] = 0;
update_option( 'discourse_publish', $discourse_publish );
$this->form_helper->checkbox_input(
'publish-category-update',
'discourse_publish',
__( 'Update the discourse publish category list.', 'wp-discourse' ),
__(
"Check this box if you've added new categories to your forum and would like them to be available on WordPress. The check box
will be reset to 'unchecked' after a single request.",
'wp-discourse'
)
);
}
/**
* Outputs markup for the use-full-post checkbox.
*/
public function full_post_checkbox() {
$discourse_admin_posting_url = isset( $this->options['url'] ) && ! empty( $this->options['url'] ) ? $this->options['url'] . '/admin/site_settings/category/posting' : null;
if ( $discourse_admin_posting_url ) {
$discourse_admin_posting_link = '<a href="' . esc_url_raw( $discourse_admin_posting_url ) . '" target="_blank" rel="noreferrer noopener">' . esc_url( $discourse_admin_posting_url ) . '</a>.';
$description = __(
"<strong>Note:</strong> to keep the 'Show Full Post' button
from appearing under your post on Discourse, you must unselect the 'embed truncate' setting on Discourse.
This setting is found at ",
'wp-discourse'
) . $discourse_admin_posting_link;
} else {
$description = __(
"<strong>Note:</strong> to keep the 'Show Full Post' button from appearing under your post on Discourse, you must uncheck the 'embed truncate' setting on Discourse.
This setting is found at http://discourse.example.com/admin/site_settings/category/posting.",
'wp-discourse'
);
}
$this->form_helper->checkbox_input( 'full-post-content', 'discourse_publish', __( 'Publish the full post to Discourse, rather than an excerpt.', 'wp-discourse' ), $description );
}
/**
* Outputs markup for the custom-excerpt-length input.
*/
public function custom_excerpt_length() {
$description = __(
'Custom excerpt length in words. If you set an excerpt in the new-post excerpt
metabox, that excerpt will be given priority over the length set here.',
'wp-discourse'
);
$this->form_helper->input( 'custom-excerpt-length', 'discourse_publish', $description, 'number', 0 );
}
/**
* Outputs markup for add-featired-link input.
*/
public function add_featured_link_checkbox() {
$this->form_helper->checkbox_input(
'add-featured-link',
'discourse_publish',
__(
'Adds a link to the WordPress post
to the Discourse topic list and topic title.',
'wp-discourse'
)
);
}
/**
* Outputs markup for the auto-publish checkbox.
*/
public function auto_publish_checkbox() {
$this->form_helper->checkbox_input(
'auto-publish',
'discourse_publish',
__( 'Mark all new posts to be published to Discourse.', 'wp-discourse' ),
__( 'This can be overridden in the Discourse Sidebar before you publish a post.', 'wp-discourse' )
);
}
/**
* Outputs markup for force-publish checkbox.
*/
public function force_publish_checkbox() {
$this->form_helper->checkbox_input(
'force-publish',
'discourse_publish',
__( 'Automatically publish all new posts and updates. Posts will be published to the Default Discourse Category.', 'wp-discourse' ),
__( '<strong>This setting is only applied when the Block Editor is used to publish posts.</strong>', 'wp-discourse' )
);
}
/**
* Outputs markup for the force-publish-max-age input.
*/
public function force_publish_max_age_input() {
$this->form_helper->input(
'force-publish-max-age',
'discourse_publish',
__(
"Max post age in days for force published posts. Older posts will not be published to Discourse.
Only applied if 'Force Publish' is enabled. Leave blank or set to 0 to allow all posts to be force published.",
'wp-discourse'
),
'number',
0
);
}
/**
* Outputs markup for the publish-failure-notice checkbox.
*/
public function publish_failure_notice_checkbox() {
$this->form_helper->checkbox_input(
'publish-failure-notice',
'discourse_publish',
__( 'Send an email notification if publishing to Discourse fails.', 'wp-discourse' ),
__(
"If the 'auto publish' option is selected, this will send a notification for any posts that fail to publish to Discourse. If that setting is not enabled, it
will only send a notification if an error is returned from Discourse.",
'wp-discourse'
)
);
}
/**
* Outputs markup for the publish-failure-email-address checkbox.
*/
public function publish_failure_email_address() {
$this->form_helper->input( 'publish-failure-email', 'discourse_publish', __( "Email address to notify on publishing failure (defaults to the site's admin email address.)", 'wp-discourse' ), 'email' );
}
/**
* Outputs markup for the auto-track checkbox.
*/
public function auto_track_checkbox() {
$this->form_helper->checkbox_input( 'auto-track', 'discourse_publish', __( 'Author automatically tracks their published Discourse topics.', 'wp-discourse' ) );
}
/**
* Outputs markup for hide-discourse-name-field checkbox.
*/
public function hide_discourse_name_field_checkbox() {
$this->form_helper->checkbox_input(
'hide-discourse-name-field',
'discourse_publish',
__(
'Removes the Discourse Name field
from the WordPress user profile page.',
'wp-discourse'
),
__(
'The username field is always visible to site admins.',
'wp-discourse'
)
);
}
/**
* Outputs markup for the discourse-username-editable checkbox.
*/
public function discourse_username_editable_checkbox() {
$this->form_helper->checkbox_input(
'discourse-username-editable',
'discourse_publish',
__(
'Allow users to edit their Discourse username on their WordPress profile page.',
'wp-discourse'
),
__(
"The Discourse username can always be edited by site admins from the user's profile page.",
'wp-discourse'
)
);
}
/**
* Outputs markup for the post-types select input.
*/
public function post_types_select() {
$this->form_helper->post_type_select_input(
'allowed_post_types',
$this->form_helper->post_types_to_publish( array( 'attachment' ) ),
__( 'Hold the <strong>control</strong> button (Windows) or the <strong>command</strong> button (Mac) to select multiple post-types.', 'wp-discourse' )
);
}
/**
* Outputs markup for the discourse_direct_db_publication_meta checkbox.
*/
public function direct_db_publication_flags() {
$this->form_helper->checkbox_input(
'direct-db-publication-flags',
'discourse_publish',
__(
'Use direct database calls for flags that control publication to discourse (EXPERIMENTAL).',
'wp-discourse'
),
__(
'Potentially prevents concurrency issues arising from object cache usage.',
'wp-discourse'
)
);
}
/**
* Outputs markup for the discourse_verbose_publication_logs checkbox.
*/
public function verbose_publication_logs() {
$this->form_helper->checkbox_input(
'verbose-publication-logs',
'discourse_publish',
__(
'Enable verbose logs for publication.',
'wp-discourse'
),
__(
'Will log successful publications as well as errors.',
'wp-discourse'
)
);
}
/**
* Details for the 'publishing_options' tab.
*/
public function publishing_settings_tab_details() {
$setup_howto_url = 'https://meta.discourse.org/t/wp-discourse-plugin-installation-and-setup/50752';
$discourse_meta_url = 'https://meta.discourse.org/';
?>
<p class="wpdc-options-documentation">
<em>
<?php esc_html_e( 'This section is for configuring how the plugin publishes posts to Discourse.', 'wp-discourse' ); ?>
</em>
</p>
<p class="wpdc-options-documentation">
<em>
<?php esc_html_e( 'For detailed instructions, see the ', 'wp-discourse' ); ?>
<a href="<?php echo esc_url( $setup_howto_url ); ?>"
target="_blank" rel="noreferrer noopener"><?php esc_html_e( 'WP Discourse plugin installation and setup', 'wp-discourse' ); ?></a>
<?php esc_html_e( 'topic on the ', 'wp-discourse' ); ?>
<a href="<?php echo esc_url( $discourse_meta_url ); ?>" target="_blank" rel="noreferrer noopener">Discourse Meta</a>
<?php esc_html_e( 'forum.', 'wp-discourse' ); ?>
</em>
</p>
<?php
}
}