Version Description
~ Added new strings for translating. ~ Corrected currency of Rwandan franc. ~ Fixed missing utils library when adding manually the orders. ~ Fixed upgrade function that doesn't hide the message when it done. ~ Fixed can't create new page in settings.
Download this release
Release Info
Developer | tunnhn |
Plugin | LearnPress – WordPress LMS Plugin |
Version | 3.2.5.6 |
Comparing to | |
See all releases |
Code changes from version 3.2.5.5 to 3.2.5.6
- inc/admin/class-lp-admin-assets.php +20 -17
- inc/admin/class-lp-admin.php +1 -1
- inc/admin/helpers/class-lp-plugins-helper.php +7 -7
- inc/admin/sub-menus/class-lp-submenu-settings.php +1 -1
- inc/admin/views/meta-boxes/order/actions.php +2 -2
- inc/admin/views/updates/html-updating-message.php +15 -1
- inc/attributes/course.php +1 -1
- inc/curds/class-lp-user-curd.php +32 -32
- inc/custom-post-types/course.php +0 -2
- inc/lp-constants.php +1 -1
- inc/lp-core-functions.php +1 -1
- inc/order/class-lp-order.php +1 -1
- inc/updates/learnpress-update-3.0.0.php +3 -1
- inc/updates/learnpress-update-base.php +12 -4
- inc/user-item/class-lp-user-item.php +1 -1
- learnpress.php +2 -2
- readme.txt +9 -2
- templates/checkout/form-logged-in.php +1 -1
- templates/widgets/popular-courses/default.php +3 -1
inc/admin/class-lp-admin-assets.php
CHANGED
@@ -71,33 +71,33 @@ class LP_Admin_Assets extends LP_Abstract_Assets {
|
|
71 |
)
|
72 |
),
|
73 |
'lp-vuex' => array(
|
74 |
-
'url'
|
75 |
-
'ver'
|
76 |
-
'deps'
|
77 |
'screens' => array(
|
78 |
'learnpress'
|
79 |
)
|
80 |
),
|
81 |
'lp-vue-resource' => array(
|
82 |
-
'url'
|
83 |
-
'ver'
|
84 |
-
'deps'
|
85 |
'screens' => array(
|
86 |
'learnpress'
|
87 |
)
|
88 |
),
|
89 |
'lp-sortable' => array(
|
90 |
-
'url'
|
91 |
-
'ver'
|
92 |
-
'deps'
|
93 |
'screens' => array(
|
94 |
'learnpress'
|
95 |
)
|
96 |
),
|
97 |
'lp-vuedraggable' => array(
|
98 |
-
'url'
|
99 |
-
'ver'
|
100 |
-
'deps'
|
101 |
'screens' => array(
|
102 |
'learnpress'
|
103 |
)
|
@@ -117,17 +117,19 @@ class LP_Admin_Assets extends LP_Abstract_Assets {
|
|
117 |
'url' => $this->url( 'js/admin/utils.js' ),
|
118 |
'deps' => array( 'jquery' )
|
119 |
),
|
120 |
-
'admin' => array(
|
121 |
-
'url'
|
122 |
-
'deps'
|
123 |
-
|
|
|
124 |
'admin-tabs' => array(
|
125 |
'url' => $this->url( 'js/admin/admin-tabs.js' ),
|
126 |
'deps' => array( 'jquery' )
|
127 |
),
|
128 |
'lp-admin' => array(
|
129 |
'url' => $this->url( 'js/admin/admin.js' ),
|
130 |
-
'deps' => array( 'learn-press-global', 'learn-press-utils', 'wp-color-picker' )
|
|
|
131 |
),
|
132 |
'lp-admin-tabs' => array(
|
133 |
'url' => $this->url( 'js/admin/admin-tabs.js' ),
|
@@ -175,6 +177,7 @@ class LP_Admin_Assets extends LP_Abstract_Assets {
|
|
175 |
'deps' => array(
|
176 |
'learn-press-modal-search-items',
|
177 |
'learn-press-modal-search-users',
|
|
|
178 |
'lp-vue'
|
179 |
),
|
180 |
'screens' => array( LP_ORDER_CPT )
|
71 |
)
|
72 |
),
|
73 |
'lp-vuex' => array(
|
74 |
+
'url' => self::url( 'js/vendor/vuex.js' ),
|
75 |
+
'ver' => '3.1.0',
|
76 |
+
'deps' => array( 'lp-vue' ),
|
77 |
'screens' => array(
|
78 |
'learnpress'
|
79 |
)
|
80 |
),
|
81 |
'lp-vue-resource' => array(
|
82 |
+
'url' => self::url( 'js/vendor/vue-resource.js' ),
|
83 |
+
'ver' => '1.3.4',
|
84 |
+
'deps' => array( 'lp-vue' ),
|
85 |
'screens' => array(
|
86 |
'learnpress'
|
87 |
)
|
88 |
),
|
89 |
'lp-sortable' => array(
|
90 |
+
'url' => self::url( 'js/vendor/sortable.js' ),
|
91 |
+
'ver' => '1.6.0',
|
92 |
+
'deps' => array( 'lp-vue' ),
|
93 |
'screens' => array(
|
94 |
'learnpress'
|
95 |
)
|
96 |
),
|
97 |
'lp-vuedraggable' => array(
|
98 |
+
'url' => self::url( 'js/vendor/vuedraggable.js' ),
|
99 |
+
'ver' => '2.14.1',
|
100 |
+
'deps' => array( 'lp-vue', 'lp-sortable' ),
|
101 |
'screens' => array(
|
102 |
'learnpress'
|
103 |
)
|
117 |
'url' => $this->url( 'js/admin/utils.js' ),
|
118 |
'deps' => array( 'jquery' )
|
119 |
),
|
120 |
+
// 'admin' => array(
|
121 |
+
// 'url' => $this->url( 'js/admin/admin.js' ),
|
122 |
+
// 'deps' => array( 'learn-press-global', 'learn-press-utils', 'wp-color-picker' ),
|
123 |
+
// 'screens' => array( 'learnpress' )
|
124 |
+
// ),
|
125 |
'admin-tabs' => array(
|
126 |
'url' => $this->url( 'js/admin/admin-tabs.js' ),
|
127 |
'deps' => array( 'jquery' )
|
128 |
),
|
129 |
'lp-admin' => array(
|
130 |
'url' => $this->url( 'js/admin/admin.js' ),
|
131 |
+
'deps' => array( 'learn-press-global', 'learn-press-utils', 'wp-color-picker' ),
|
132 |
+
'screens' => array( 'learnpress' )
|
133 |
),
|
134 |
'lp-admin-tabs' => array(
|
135 |
'url' => $this->url( 'js/admin/admin-tabs.js' ),
|
177 |
'deps' => array(
|
178 |
'learn-press-modal-search-items',
|
179 |
'learn-press-modal-search-users',
|
180 |
+
'learn-press-utils',
|
181 |
'lp-vue'
|
182 |
),
|
183 |
'screens' => array( LP_ORDER_CPT )
|
inc/admin/class-lp-admin.php
CHANGED
@@ -485,7 +485,7 @@ if ( ! class_exists( 'LP_Admin' ) ) {
|
|
485 |
'denied-request'
|
486 |
) ) ) && ( $user_id = LP_Request::get_int( 'user_id' ) ) && get_user_by( 'id', $user_id ) ) {
|
487 |
if ( ! current_user_can( 'promote_user', $user_id ) ) {
|
488 |
-
wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
|
489 |
} ?>
|
490 |
|
491 |
<div class="updated notice">
|
485 |
'denied-request'
|
486 |
) ) ) && ( $user_id = LP_Request::get_int( 'user_id' ) ) && get_user_by( 'id', $user_id ) ) {
|
487 |
if ( ! current_user_can( 'promote_user', $user_id ) ) {
|
488 |
+
wp_die( __( 'Sorry, you are not allowed to edit this user.', 'learnpress' ) );
|
489 |
} ?>
|
490 |
|
491 |
<div class="updated notice">
|
inc/admin/helpers/class-lp-plugins-helper.php
CHANGED
@@ -235,23 +235,23 @@ class LP_Plugins_Helper {
|
|
235 |
case 'install':
|
236 |
if ( $status['url'] ) {
|
237 |
/* translators: 1: Plugin name and version. */
|
238 |
-
$action_links[] = '<a class="install-now button" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $status['url'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Install %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '" data-success="Installed"><span>' . __( 'Install Now' ) . '</span></a>';
|
239 |
}
|
240 |
|
241 |
break;
|
242 |
case 'update_available':
|
243 |
if ( $status['url'] ) {
|
244 |
/* translators: 1: Plugin name and version */
|
245 |
-
$action_links[] = '<a class="update-now button" data-plugin="' . esc_attr( $status['file'] ) . '" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $status['url'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Update %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Update Now' ) . '</span></a>';
|
246 |
}
|
247 |
|
248 |
break;
|
249 |
}
|
250 |
if ( learn_press_is_plugin_install( $file ) ) {
|
251 |
if ( is_plugin_active( $file ) ) {
|
252 |
-
$action_links[] = '<a class="button disable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $file, 'deactivate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Disable %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Disable Now', 'learnpress' ) . '</span></a>';
|
253 |
} else {
|
254 |
-
$action_links[] = '<a class="button enable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=activate&plugin=' . $file, 'activate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Enable %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Enable Now', 'learnpress' ) . '</span></a>';
|
255 |
}
|
256 |
}
|
257 |
|
@@ -259,14 +259,14 @@ class LP_Plugins_Helper {
|
|
259 |
// action links for premium add-ons installed
|
260 |
if ( learn_press_is_plugin_install( $file ) ) {
|
261 |
if ( is_plugin_active( $file ) ) {
|
262 |
-
$action_links[] = '<a class="button disable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $file, 'deactivate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Disable %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Disable Now', 'learnpress' ) . '</span></a>';
|
263 |
} else {
|
264 |
-
$action_links[] = '<a class="button enable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=activate&plugin=' . $file, 'activate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Enable %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Enable Now', 'learnpress' ) . '</span></a>';
|
265 |
}
|
266 |
} else {
|
267 |
// buy now button for premium add-ons
|
268 |
if ( isset( $plugin['permarklink'] ) ) {
|
269 |
-
$action_links[] = '<a class="buy-now button" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $plugin['permarklink'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Buy %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '">' . __( 'Buy Now' ) . '</a>';
|
270 |
}
|
271 |
}
|
272 |
}
|
235 |
case 'install':
|
236 |
if ( $status['url'] ) {
|
237 |
/* translators: 1: Plugin name and version. */
|
238 |
+
$action_links[] = '<a class="install-now button" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $status['url'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Install %s now', 'learnpress' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '" data-success="Installed"><span>' . __( 'Install Now' ) . '</span></a>';
|
239 |
}
|
240 |
|
241 |
break;
|
242 |
case 'update_available':
|
243 |
if ( $status['url'] ) {
|
244 |
/* translators: 1: Plugin name and version */
|
245 |
+
$action_links[] = '<a class="update-now button" data-plugin="' . esc_attr( $status['file'] ) . '" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $status['url'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Update %s now', 'learnpress' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Update Now' ) . '</span></a>';
|
246 |
}
|
247 |
|
248 |
break;
|
249 |
}
|
250 |
if ( learn_press_is_plugin_install( $file ) ) {
|
251 |
if ( is_plugin_active( $file ) ) {
|
252 |
+
$action_links[] = '<a class="button disable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $file, 'deactivate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Disable %s now', 'learnpress' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Disable Now', 'learnpress' ) . '</span></a>';
|
253 |
} else {
|
254 |
+
$action_links[] = '<a class="button enable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=activate&plugin=' . $file, 'activate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Enable %s now', 'learnpress' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Enable Now', 'learnpress' ) . '</span></a>';
|
255 |
}
|
256 |
}
|
257 |
|
259 |
// action links for premium add-ons installed
|
260 |
if ( learn_press_is_plugin_install( $file ) ) {
|
261 |
if ( is_plugin_active( $file ) ) {
|
262 |
+
$action_links[] = '<a class="button disable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=deactivate&plugin=' . $file, 'deactivate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Disable %s now', 'learnpress' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Disable Now', 'learnpress' ) . '</span></a>';
|
263 |
} else {
|
264 |
+
$action_links[] = '<a class="button enable-now" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( wp_nonce_url( 'plugins.php?action=activate&plugin=' . $file, 'activate-plugin_' . $file ) ) . '" aria-label="' . esc_attr( sprintf( __( 'Enable %s now', 'learnpress' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '"><span>' . __( 'Enable Now', 'learnpress' ) . '</span></a>';
|
265 |
}
|
266 |
} else {
|
267 |
// buy now button for premium add-ons
|
268 |
if ( isset( $plugin['permarklink'] ) ) {
|
269 |
+
$action_links[] = '<a class="buy-now button" data-slug="' . esc_attr( $plugin['slug'] ) . '" href="' . esc_url( $plugin['permarklink'] ) . '" aria-label="' . esc_attr( sprintf( __( 'Buy %s now' ), $name ) ) . '" data-name="' . esc_attr( $name ) . '">' . __( 'Buy Now', 'learnpress' ) . '</a>';
|
270 |
}
|
271 |
}
|
272 |
}
|
inc/admin/sub-menus/class-lp-submenu-settings.php
CHANGED
@@ -60,7 +60,7 @@ class LP_Submenu_Settings extends LP_Abstract_Submenu {
|
|
60 |
break;
|
61 |
case 'emails':
|
62 |
$sections = array(
|
63 |
-
'new_course' => __( 'New course' )
|
64 |
);
|
65 |
$this->sections = apply_filters( 'learn-press/admin/page-settings/emails/sections', $sections );
|
66 |
break;
|
60 |
break;
|
61 |
case 'emails':
|
62 |
$sections = array(
|
63 |
+
'new_course' => __( 'New course', 'learnpress' )
|
64 |
);
|
65 |
$this->sections = apply_filters( 'learn-press/admin/page-settings/emails/sections', $sections );
|
66 |
break;
|
inc/admin/views/meta-boxes/order/actions.php
CHANGED
@@ -26,9 +26,9 @@ defined( 'ABSPATH' ) || exit();
|
|
26 |
<?php
|
27 |
if ( current_user_can( "delete_post", $post->ID ) ) {
|
28 |
if ( ! EMPTY_TRASH_DAYS ) {
|
29 |
-
$delete_text = __( 'Delete Permanently' );
|
30 |
} else {
|
31 |
-
$delete_text = __( 'Move to Trash' );
|
32 |
} ?>
|
33 |
<a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>">
|
34 |
<?php echo $delete_text; ?>
|
26 |
<?php
|
27 |
if ( current_user_can( "delete_post", $post->ID ) ) {
|
28 |
if ( ! EMPTY_TRASH_DAYS ) {
|
29 |
+
$delete_text = __( 'Delete Permanently', 'learnpress' );
|
30 |
} else {
|
31 |
+
$delete_text = __( 'Move to Trash', 'learnpress' );
|
32 |
} ?>
|
33 |
<a class="submitdelete deletion" href="<?php echo get_delete_post_link( $post->ID ); ?>">
|
34 |
<?php echo $delete_text; ?>
|
inc/admin/views/updates/html-updating-message.php
CHANGED
@@ -19,6 +19,20 @@ defined( 'ABSPATH' ) or die();
|
|
19 |
(function (win, doc) {
|
20 |
var t = null;
|
21 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
function sendRequest() {
|
23 |
t = setTimeout(function () {
|
24 |
var $ = jQuery;
|
@@ -28,7 +42,7 @@ defined( 'ABSPATH' ) or die();
|
|
28 |
'lp-ajax': 'check-updated'
|
29 |
},
|
30 |
success: function (response) {
|
31 |
-
response =
|
32 |
if (response.result === 'success') {
|
33 |
clearInterval(t);
|
34 |
$('.lp-notice-update-database.do-updating').replaceWith($(response.message));
|
19 |
(function (win, doc) {
|
20 |
var t = null;
|
21 |
|
22 |
+
function parseJSON(data) {
|
23 |
+
var m = (data + '').match(/<-- LP_AJAX_START -->(.*)<-- LP_AJAX_END -->/);
|
24 |
+
try {
|
25 |
+
if (m) {
|
26 |
+
data = $.parseJSON(m[1]);
|
27 |
+
} else {
|
28 |
+
data = $.parseJSON(data);
|
29 |
+
}
|
30 |
+
} catch (e) {
|
31 |
+
data = {};
|
32 |
+
}
|
33 |
+
return data;
|
34 |
+
}
|
35 |
+
|
36 |
function sendRequest() {
|
37 |
t = setTimeout(function () {
|
38 |
var $ = jQuery;
|
42 |
'lp-ajax': 'check-updated'
|
43 |
},
|
44 |
success: function (response) {
|
45 |
+
response = parseJSON(response);
|
46 |
if (response.result === 'success') {
|
47 |
clearInterval(t);
|
48 |
$('.lp-notice-update-database.do-updating').replaceWith($(response.message));
|
inc/attributes/course.php
CHANGED
@@ -228,7 +228,7 @@ if ( !class_exists( 'LP_Course_Attributes' ) ) {
|
|
228 |
'edit' => sprintf(
|
229 |
'<a href="%s" aria-label="%s" >%s </a > ',
|
230 |
esc_url( $edit_link ),
|
231 |
-
esc_attr( sprintf( __( 'Edit “%s”' ), $tax->name ) ),
|
232 |
__( 'Edit', 'learnpress' )
|
233 |
),
|
234 |
'delete' => sprintf(
|
228 |
'edit' => sprintf(
|
229 |
'<a href="%s" aria-label="%s" >%s </a > ',
|
230 |
esc_url( $edit_link ),
|
231 |
+
esc_attr( sprintf( __( 'Edit “%s”', 'learnpress' ), $tax->name ) ),
|
232 |
__( 'Edit', 'learnpress' )
|
233 |
),
|
234 |
'delete' => sprintf(
|
inc/curds/class-lp-user-curd.php
CHANGED
@@ -125,51 +125,51 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
125 |
* @return array|mixed
|
126 |
*/
|
127 |
public function get_orders( $user_id, $args = array() ) {
|
128 |
-
|
129 |
// If user does not exists
|
130 |
if ( ! $user_id || ! $user = learn_press_get_user( $user_id ) ) {
|
131 |
return false;
|
132 |
}
|
133 |
-
|
134 |
$cache_key = false;
|
135 |
if ( $args ) {
|
136 |
$args = wp_parse_args(
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
ksort( $args );
|
145 |
$cache_key = md5( serialize( $args ) );
|
146 |
-
|
147 |
/**
|
148 |
* Get orders from cache by args
|
149 |
*/
|
150 |
if ( false !== ( $orders = LP_Object_Cache::get( "user-{$user_id}-" . $cache_key, 'lp-user-orders' ) ) ) {
|
151 |
LP_Debug::log_function( __CLASS__ . '::' . __FUNCTION__ );
|
152 |
-
|
153 |
return $orders;
|
154 |
}
|
155 |
}
|
156 |
// Get orders for the user from cache
|
157 |
$orders = LP_Object_Cache::get( 'user-' . $user_id, 'lp-user-orders' );
|
158 |
-
|
159 |
if ( false === $orders ) {
|
160 |
global $wpdb;
|
161 |
-
|
162 |
$orders = array();
|
163 |
$post_status_in = learn_press_get_order_statuses( true, true );
|
164 |
$post_status_in_format = array_fill( 0, sizeof( $post_status_in ), '%s' );
|
165 |
-
|
166 |
// Get order by user
|
167 |
$sql_orders = $wpdb->prepare( "
|
168 |
SELECT p.*
|
169 |
FROM {$wpdb->posts} p
|
170 |
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND meta_key = %s AND meta_value = %d
|
171 |
", '_user_id', $user_id );
|
172 |
-
|
173 |
/**
|
174 |
* Get order checked out by Guest but with the email of the user are getting
|
175 |
*/
|
@@ -179,7 +179,7 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
179 |
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND meta_key = %s AND meta_value = %s
|
180 |
LEFT JOIN {$wpdb->postmeta} pmu ON p.ID = pmu.post_id AND pmu.meta_key = %s AND pmu.meta_value IS NULL
|
181 |
", '_checkout_email', $user->get_email(), '_user_id' );
|
182 |
-
|
183 |
/**
|
184 |
* The rest
|
185 |
*/
|
@@ -188,22 +188,22 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
188 |
AND p.post_status IN(" . join( ',', $post_status_in_format ) . ")
|
189 |
ORDER BY ID DESC
|
190 |
", array_merge( array(
|
191 |
-
|
192 |
), $post_status_in ) );
|
193 |
-
|
194 |
$sql = $sql_orders . " UNION " . $sql_guest_orders . $sql_rest;
|
195 |
-
|
196 |
if ( $order_posts = $wpdb->get_results( $sql ) ) {
|
197 |
$order_ids = array();
|
198 |
foreach ( $order_posts as $order_post ) {
|
199 |
-
|
200 |
// Put post into cache to user later ... maybe.
|
201 |
$_post = sanitize_post( $order_post, 'raw' );
|
202 |
wp_cache_add( $_post->ID, $_post, 'posts' );
|
203 |
-
|
204 |
$order_ids[] = $_post->ID;
|
205 |
}
|
206 |
-
|
207 |
$order_ids_format = array_fill( 0, sizeof( $order_ids ), '%d' );
|
208 |
$query = $wpdb->prepare( "
|
209 |
SELECT meta_value as course_id, order_id
|
@@ -212,7 +212,7 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
212 |
WHERE oi.order_id IN (" . join( ',', $order_ids_format ) . ")
|
213 |
ORDER BY FIELD(order_id, " . join( ',', $order_ids_format ) . ")
|
214 |
", array_merge( array( '_course_id' ), $order_ids, $order_ids ) );
|
215 |
-
|
216 |
if ( $results = $wpdb->get_results( $query ) ) {
|
217 |
foreach ( $results as $result ) {
|
218 |
if ( empty( $orders[ $result->course_id ] ) ) {
|
@@ -225,11 +225,11 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
225 |
// Store to cache
|
226 |
LP_Object_Cache::set( 'user-' . $user_id, $orders, 'lp-user-orders' );
|
227 |
}
|
228 |
-
|
229 |
if ( $orders ) {
|
230 |
if ( array_key_exists( 'status', $args ) && $args['status'] ) {
|
231 |
LP_Helper::sanitize_order_status( $args['status'] );
|
232 |
-
|
233 |
$statuses = (array) $args['status'];
|
234 |
foreach ( $orders as $course_id => $order_ids ) {
|
235 |
$orders[ $course_id ] = array();
|
@@ -240,18 +240,18 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
240 |
}
|
241 |
}
|
242 |
}
|
243 |
-
|
244 |
if ( array_key_exists( 'group_by_order', $args ) && $args['group_by_order'] ) {
|
245 |
$this->_group_orders( $orders );
|
246 |
}
|
247 |
}
|
248 |
-
|
249 |
if ( $cache_key ) {
|
250 |
LP_Object_Cache::set( "user-{$user_id}-" . $cache_key, $orders, 'lp-user-orders' );
|
251 |
}
|
252 |
-
|
253 |
LP_Debug::log_function( __CLASS__ . '::' . __FUNCTION__ );
|
254 |
-
|
255 |
return $orders;
|
256 |
}
|
257 |
|
@@ -1315,7 +1315,7 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
1315 |
* Get an array of all orders are completed with keys are id of
|
1316 |
* courses
|
1317 |
*/
|
1318 |
-
$orders
|
1319 |
|
1320 |
if ( ! $orders ) {
|
1321 |
throw new Exception( "", 0 );
|
@@ -1348,7 +1348,7 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
1348 |
$from = "FROM {$wpdb->learnpress_user_items} ui";
|
1349 |
|
1350 |
// JOIN
|
1351 |
-
$join = "INNER JOIN {$wpdb->posts} c ON c.ID = ui.item_id";
|
1352 |
|
1353 |
// WHERE
|
1354 |
$where = $wpdb->prepare( "
|
@@ -1652,7 +1652,7 @@ class LP_User_CURD extends LP_Object_Data_CURD implements LP_Interface_CURD {
|
|
1652 |
) );
|
1653 |
break;
|
1654 |
}
|
1655 |
-
}else {
|
1656 |
|
1657 |
$having .= $wpdb->prepare( " AND X.status IN( %s, %s )", array(
|
1658 |
'started',
|
125 |
* @return array|mixed
|
126 |
*/
|
127 |
public function get_orders( $user_id, $args = array() ) {
|
128 |
+
|
129 |
// If user does not exists
|
130 |
if ( ! $user_id || ! $user = learn_press_get_user( $user_id ) ) {
|
131 |
return false;
|
132 |
}
|
133 |
+
|
134 |
$cache_key = false;
|
135 |
if ( $args ) {
|
136 |
$args = wp_parse_args(
|
137 |
+
$args,
|
138 |
+
array(
|
139 |
+
'group_by_order' => false,
|
140 |
+
'status' => ''
|
141 |
+
)
|
142 |
+
);
|
143 |
+
|
144 |
ksort( $args );
|
145 |
$cache_key = md5( serialize( $args ) );
|
146 |
+
|
147 |
/**
|
148 |
* Get orders from cache by args
|
149 |
*/
|
150 |
if ( false !== ( $orders = LP_Object_Cache::get( "user-{$user_id}-" . $cache_key, 'lp-user-orders' ) ) ) {
|
151 |
LP_Debug::log_function( __CLASS__ . '::' . __FUNCTION__ );
|
152 |
+
|
153 |
return $orders;
|
154 |
}
|
155 |
}
|
156 |
// Get orders for the user from cache
|
157 |
$orders = LP_Object_Cache::get( 'user-' . $user_id, 'lp-user-orders' );
|
158 |
+
|
159 |
if ( false === $orders ) {
|
160 |
global $wpdb;
|
161 |
+
|
162 |
$orders = array();
|
163 |
$post_status_in = learn_press_get_order_statuses( true, true );
|
164 |
$post_status_in_format = array_fill( 0, sizeof( $post_status_in ), '%s' );
|
165 |
+
|
166 |
// Get order by user
|
167 |
$sql_orders = $wpdb->prepare( "
|
168 |
SELECT p.*
|
169 |
FROM {$wpdb->posts} p
|
170 |
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND meta_key = %s AND meta_value = %d
|
171 |
", '_user_id', $user_id );
|
172 |
+
|
173 |
/**
|
174 |
* Get order checked out by Guest but with the email of the user are getting
|
175 |
*/
|
179 |
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND meta_key = %s AND meta_value = %s
|
180 |
LEFT JOIN {$wpdb->postmeta} pmu ON p.ID = pmu.post_id AND pmu.meta_key = %s AND pmu.meta_value IS NULL
|
181 |
", '_checkout_email', $user->get_email(), '_user_id' );
|
182 |
+
|
183 |
/**
|
184 |
* The rest
|
185 |
*/
|
188 |
AND p.post_status IN(" . join( ',', $post_status_in_format ) . ")
|
189 |
ORDER BY ID DESC
|
190 |
", array_merge( array(
|
191 |
+
LP_ORDER_CPT
|
192 |
), $post_status_in ) );
|
193 |
+
|
194 |
$sql = $sql_orders . " UNION " . $sql_guest_orders . $sql_rest;
|
195 |
+
|
196 |
if ( $order_posts = $wpdb->get_results( $sql ) ) {
|
197 |
$order_ids = array();
|
198 |
foreach ( $order_posts as $order_post ) {
|
199 |
+
|
200 |
// Put post into cache to user later ... maybe.
|
201 |
$_post = sanitize_post( $order_post, 'raw' );
|
202 |
wp_cache_add( $_post->ID, $_post, 'posts' );
|
203 |
+
|
204 |
$order_ids[] = $_post->ID;
|
205 |
}
|
206 |
+
|
207 |
$order_ids_format = array_fill( 0, sizeof( $order_ids ), '%d' );
|
208 |
$query = $wpdb->prepare( "
|
209 |
SELECT meta_value as course_id, order_id
|
212 |
WHERE oi.order_id IN (" . join( ',', $order_ids_format ) . ")
|
213 |
ORDER BY FIELD(order_id, " . join( ',', $order_ids_format ) . ")
|
214 |
", array_merge( array( '_course_id' ), $order_ids, $order_ids ) );
|
215 |
+
|
216 |
if ( $results = $wpdb->get_results( $query ) ) {
|
217 |
foreach ( $results as $result ) {
|
218 |
if ( empty( $orders[ $result->course_id ] ) ) {
|
225 |
// Store to cache
|
226 |
LP_Object_Cache::set( 'user-' . $user_id, $orders, 'lp-user-orders' );
|
227 |
}
|
228 |
+
|
229 |
if ( $orders ) {
|
230 |
if ( array_key_exists( 'status', $args ) && $args['status'] ) {
|
231 |
LP_Helper::sanitize_order_status( $args['status'] );
|
232 |
+
|
233 |
$statuses = (array) $args['status'];
|
234 |
foreach ( $orders as $course_id => $order_ids ) {
|
235 |
$orders[ $course_id ] = array();
|
240 |
}
|
241 |
}
|
242 |
}
|
243 |
+
|
244 |
if ( array_key_exists( 'group_by_order', $args ) && $args['group_by_order'] ) {
|
245 |
$this->_group_orders( $orders );
|
246 |
}
|
247 |
}
|
248 |
+
|
249 |
if ( $cache_key ) {
|
250 |
LP_Object_Cache::set( "user-{$user_id}-" . $cache_key, $orders, 'lp-user-orders' );
|
251 |
}
|
252 |
+
|
253 |
LP_Debug::log_function( __CLASS__ . '::' . __FUNCTION__ );
|
254 |
+
|
255 |
return $orders;
|
256 |
}
|
257 |
|
1315 |
* Get an array of all orders are completed with keys are id of
|
1316 |
* courses
|
1317 |
*/
|
1318 |
+
$orders = $this->get_orders( $user_id, array( 'status' => 'completed' ) );
|
1319 |
|
1320 |
if ( ! $orders ) {
|
1321 |
throw new Exception( "", 0 );
|
1348 |
$from = "FROM {$wpdb->learnpress_user_items} ui";
|
1349 |
|
1350 |
// JOIN
|
1351 |
+
$join = $wpdb->prepare( "INNER JOIN {$wpdb->posts} c ON c.ID = ui.item_id AND c.post_type = %s", LP_COURSE_CPT );
|
1352 |
|
1353 |
// WHERE
|
1354 |
$where = $wpdb->prepare( "
|
1652 |
) );
|
1653 |
break;
|
1654 |
}
|
1655 |
+
} else {
|
1656 |
|
1657 |
$having .= $wpdb->prepare( " AND X.status IN( %s, %s )", array(
|
1658 |
'started',
|
inc/custom-post-types/course.php
CHANGED
@@ -1268,8 +1268,6 @@ if ( ! class_exists( 'LP_Course_Post_Type' ) ) {
|
|
1268 |
$end = strtotime( $sale_price_end );
|
1269 |
$start = strtotime( $sale_price_start );
|
1270 |
|
1271 |
-
learn_press_debug($now, $sale_price_end, $sale_price_start, $end,$start);
|
1272 |
-
|
1273 |
return ( ( $sale_price_start ) && ( $now <= $end || ! $sale_price_end ) || ( ! $sale_price_start && ! $sale_price_end ) );
|
1274 |
}
|
1275 |
|
1268 |
$end = strtotime( $sale_price_end );
|
1269 |
$start = strtotime( $sale_price_start );
|
1270 |
|
|
|
|
|
1271 |
return ( ( $sale_price_start ) && ( $now <= $end || ! $sale_price_end ) || ( ! $sale_price_start && ! $sale_price_end ) );
|
1272 |
}
|
1273 |
|
inc/lp-constants.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
*/
|
5 |
$upload_dir = wp_upload_dir();
|
6 |
// version
|
7 |
-
define( 'LEARNPRESS_VERSION', '3.2.5.
|
8 |
|
9 |
define( 'LP_WP_CONTENT', basename( WP_CONTENT_DIR ) );
|
10 |
|
4 |
*/
|
5 |
$upload_dir = wp_upload_dir();
|
6 |
// version
|
7 |
+
define( 'LEARNPRESS_VERSION', '3.2.5.6' );
|
8 |
|
9 |
define( 'LP_WP_CONTENT', basename( WP_CONTENT_DIR ) );
|
10 |
|
inc/lp-core-functions.php
CHANGED
@@ -1316,7 +1316,7 @@ function learn_press_currency_symbols() {
|
|
1316 |
'RON' => 'lei',
|
1317 |
'RSD' => 'Дин.',
|
1318 |
'RUB' => 'руб',
|
1319 |
-
'RWF' => '
|
1320 |
'SAR' => '﷼',
|
1321 |
'SBD' => '$',
|
1322 |
'SCR' => '₨',
|
1316 |
'RON' => 'lei',
|
1317 |
'RSD' => 'Дин.',
|
1318 |
'RUB' => 'руб',
|
1319 |
+
'RWF' => 'R₣',
|
1320 |
'SAR' => '﷼',
|
1321 |
'SBD' => '$',
|
1322 |
'SCR' => '₨',
|
inc/order/class-lp-order.php
CHANGED
@@ -144,7 +144,7 @@ if ( ! class_exists( 'LP_Order' ) ) {
|
|
144 |
$time_diff = time() - $time;
|
145 |
|
146 |
if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
|
147 |
-
$date = sprintf( __( '%s ago' ), human_time_diff( $time ) );
|
148 |
} else {
|
149 |
$date = mysql2date( get_option( 'date_format' ), $m_time );
|
150 |
}
|
144 |
$time_diff = time() - $time;
|
145 |
|
146 |
if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
|
147 |
+
$date = sprintf( __( '%s ago', 'learnpress' ), human_time_diff( $time ) );
|
148 |
} else {
|
149 |
$date = mysql2date( get_option( 'date_format' ), $m_time );
|
150 |
}
|
inc/updates/learnpress-update-3.0.0.php
CHANGED
@@ -243,7 +243,7 @@ class LP_Update_30 extends LP_Update_Base {
|
|
243 |
|
244 |
global $wpdb;
|
245 |
|
246 |
-
|
247 |
INSERT INTO {$wpdb->learnpress_user_itemmeta}( `learnpress_user_item_id`, `meta_key`, `meta_value` )
|
248 |
SELECT user_item_id, %s, COUNT(user_item_id) - 1 Y
|
249 |
FROM (
|
@@ -257,6 +257,8 @@ class LP_Update_30 extends LP_Update_Base {
|
|
257 |
|
258 |
$wpdb->query( $query );
|
259 |
|
|
|
|
|
260 |
return false;
|
261 |
}
|
262 |
|
243 |
|
244 |
global $wpdb;
|
245 |
|
246 |
+
$query = $wpdb->prepare( "
|
247 |
INSERT INTO {$wpdb->learnpress_user_itemmeta}( `learnpress_user_item_id`, `meta_key`, `meta_value` )
|
248 |
SELECT user_item_id, %s, COUNT(user_item_id) - 1 Y
|
249 |
FROM (
|
257 |
|
258 |
$wpdb->query( $query );
|
259 |
|
260 |
+
$this->output($query);
|
261 |
+
|
262 |
return false;
|
263 |
}
|
264 |
|
inc/updates/learnpress-update-base.php
CHANGED
@@ -85,14 +85,14 @@ class LP_Update_Base {
|
|
85 |
if ( $callback == $step ) {
|
86 |
if ( is_callable( array( $this, $callback ) ) ) {
|
87 |
|
88 |
-
|
89 |
update_option( 'learnpress_updater_running_step', $step );
|
90 |
if ( $return = call_user_func( array( $this, $callback ) ) ) {
|
91 |
$this->_next_step();
|
92 |
}
|
93 |
|
94 |
} else {
|
95 |
-
|
96 |
$this->_next_step();
|
97 |
}
|
98 |
|
@@ -103,13 +103,13 @@ class LP_Update_Base {
|
|
103 |
}
|
104 |
|
105 |
if ( ! $called ) {
|
106 |
-
|
107 |
$this->_next_step();
|
108 |
}
|
109 |
|
110 |
}
|
111 |
catch ( Exception $exception ) {
|
112 |
-
|
113 |
LP_Debug::rollbackTransaction();
|
114 |
}
|
115 |
|
@@ -140,6 +140,14 @@ class LP_Update_Base {
|
|
140 |
return $step === $end_step;
|
141 |
}
|
142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
/**
|
144 |
* Move to next step
|
145 |
*/
|
85 |
if ( $callback == $step ) {
|
86 |
if ( is_callable( array( $this, $callback ) ) ) {
|
87 |
|
88 |
+
$this->output( "Running " . get_class( $this ) . '::' . $callback . "\n" );
|
89 |
update_option( 'learnpress_updater_running_step', $step );
|
90 |
if ( $return = call_user_func( array( $this, $callback ) ) ) {
|
91 |
$this->_next_step();
|
92 |
}
|
93 |
|
94 |
} else {
|
95 |
+
$this->output( "$callback failed" );
|
96 |
$this->_next_step();
|
97 |
}
|
98 |
|
103 |
}
|
104 |
|
105 |
if ( ! $called ) {
|
106 |
+
$this->output( "Step {$step} not found" );
|
107 |
$this->_next_step();
|
108 |
}
|
109 |
|
110 |
}
|
111 |
catch ( Exception $exception ) {
|
112 |
+
$this->output( $exception->getMessage() );
|
113 |
LP_Debug::rollbackTransaction();
|
114 |
}
|
115 |
|
140 |
return $step === $end_step;
|
141 |
}
|
142 |
|
143 |
+
protected function output( $content ) {
|
144 |
+
if ( ! learn_press_is_ajax() ) {
|
145 |
+
return;
|
146 |
+
}
|
147 |
+
|
148 |
+
print_r( $content );
|
149 |
+
}
|
150 |
+
|
151 |
/**
|
152 |
* Move to next step
|
153 |
*/
|
inc/user-item/class-lp-user-item.php
CHANGED
@@ -157,7 +157,7 @@ class LP_User_Item extends LP_Abstract_Object_Data implements ArrayAccess {
|
|
157 |
$time_diff = time() - $time;
|
158 |
|
159 |
if ( $human_diff_time && $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
|
160 |
-
$h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
|
161 |
} else {
|
162 |
$h_time = mysql2date( $format, $m_time );
|
163 |
}
|
157 |
$time_diff = time() - $time;
|
158 |
|
159 |
if ( $human_diff_time && $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) {
|
160 |
+
$h_time = sprintf( __( '%s ago', 'learnpress' ), human_time_diff( $time ) );
|
161 |
} else {
|
162 |
$h_time = mysql2date( $format, $m_time );
|
163 |
}
|
learnpress.php
CHANGED
@@ -4,10 +4,10 @@ Plugin Name: LearnPress
|
|
4 |
Plugin URI: http://thimpress.com/learnpress
|
5 |
Description: LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
|
6 |
Author: ThimPress
|
7 |
-
Version: 3.2.5.
|
8 |
Author URI: http://thimpress.com
|
9 |
Requires at least: 3.8
|
10 |
-
Tested up to: 5.2
|
11 |
|
12 |
Text Domain: learnpress
|
13 |
Domain Path: /languages/
|
4 |
Plugin URI: http://thimpress.com/learnpress
|
5 |
Description: LearnPress is a WordPress complete solution for creating a Learning Management System (LMS). It can help you to create courses, lessons and quizzes.
|
6 |
Author: ThimPress
|
7 |
+
Version: 3.2.5.6
|
8 |
Author URI: http://thimpress.com
|
9 |
Requires at least: 3.8
|
10 |
+
Tested up to: 5.0.2
|
11 |
|
12 |
Text Domain: learnpress
|
13 |
Domain Path: /languages/
|
readme.txt
CHANGED
@@ -3,8 +3,8 @@ Contributors: thimpress, tunnhn, phonglq.foobla, thongta, kendy73, leehld
|
|
3 |
Donate link:
|
4 |
Tags: WordPress LMS, LMS, eLearning, e-Learning, Learning Management System, LMS WordPress, Course, Courses, Quiz, Quizzes, Training, Guru, Sell Courses
|
5 |
Requires at least: 3.8
|
6 |
-
Tested up to: 5.2
|
7 |
-
Stable tag: 3.2.5.
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -199,6 +199,13 @@ https://www.transifex.com/projects/p/learnpress/
|
|
199 |
8. Add-ons of LearnPress.
|
200 |
|
201 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
202 |
= 3.2.5.5 =
|
203 |
~ Fixed guest can not start quiz with no require enroll course option.
|
204 |
~ Fixed sql to filter orders by user ID.
|
3 |
Donate link:
|
4 |
Tags: WordPress LMS, LMS, eLearning, e-Learning, Learning Management System, LMS WordPress, Course, Courses, Quiz, Quizzes, Training, Guru, Sell Courses
|
5 |
Requires at least: 3.8
|
6 |
+
Tested up to: 5.0.2
|
7 |
+
Stable tag: 3.2.5.6
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
199 |
8. Add-ons of LearnPress.
|
200 |
|
201 |
== Changelog ==
|
202 |
+
= 3.2.5.6 =
|
203 |
+
~ Added new strings for translating.
|
204 |
+
~ Corrected currency of Rwandan franc.
|
205 |
+
~ Fixed missing utils library when adding manually the orders.
|
206 |
+
~ Fixed upgrade function that doesn't hide the message when it done.
|
207 |
+
~ Fixed can't create new page in settings.
|
208 |
+
|
209 |
= 3.2.5.5 =
|
210 |
~ Fixed guest can not start quiz with no require enroll course option.
|
211 |
~ Fixed sql to filter orders by user ID.
|
templates/checkout/form-logged-in.php
CHANGED
@@ -24,7 +24,7 @@ global $user_identity;
|
|
24 |
?>
|
25 |
|
26 |
<p>
|
27 |
-
<?php printf( __( 'Logged in as <a href="%1$s">%2$s</a>.' ), get_edit_user_link(), $user_identity ); ?>
|
28 |
|
29 |
<a href="<?php echo wp_logout_url( get_permalink() ); ?>"
|
30 |
title="<?php esc_attr_e( 'Log out of this account', 'learnpress' ); ?>"><?php _e( 'Log out »', 'learnpress' ); ?></a>
|
24 |
?>
|
25 |
|
26 |
<p>
|
27 |
+
<?php printf( __( 'Logged in as <a href="%1$s">%2$s</a>.', 'learnpress' ), get_edit_user_link(), $user_identity ); ?>
|
28 |
|
29 |
<a href="<?php echo wp_logout_url( get_permalink() ); ?>"
|
30 |
title="<?php esc_attr_e( 'Log out of this account', 'learnpress' ); ?>"><?php _e( 'Log out »', 'learnpress' ); ?></a>
|
templates/widgets/popular-courses/default.php
CHANGED
@@ -30,7 +30,9 @@ $instance = $this->instance;
|
|
30 |
|
31 |
<div class="widget-body">
|
32 |
<?php foreach ( $courses as $course_id ) {
|
33 |
-
|
|
|
|
|
34 |
$post = get_post( $course_id );
|
35 |
setup_postdata( $post );
|
36 |
$course = learn_press_get_course( $course_id );
|
30 |
|
31 |
<div class="widget-body">
|
32 |
<?php foreach ( $courses as $course_id ) {
|
33 |
+
if ( ! $course_id ) {
|
34 |
+
continue;
|
35 |
+
}
|
36 |
$post = get_post( $course_id );
|
37 |
setup_postdata( $post );
|
38 |
$course = learn_press_get_course( $course_id );
|