├── .gitignore ├── README.md ├── add-ons ├── README.md ├── convertkit-paid-memberships-pro │ └── remove-tags-after-level-change.php ├── pmpro-abandoned-cart-recovery │ ├── attempt-recovery-if-upgrading.php │ └── attempt-recovery-if-user-does-not-have-level.php ├── pmpro-addon-packages │ ├── addon-packages-checkout-requires-another-addon-package.php │ ├── addon-packages-level-all-access.php │ ├── addon-packages-set-price-for-all.php │ └── change-frontend-text-addon-package-purchase.php ├── pmpro-address-for-free-levels │ └── hide-billing-fields-for-some.php ├── pmpro-advanced-levels-shortcode │ └── allow-additional-html-tags-in-advanced-levels-shortcode-text.php ├── pmpro-affiliates │ ├── create-affiliates-bulk.php │ ├── create-manage-affiliates-by-level.php │ └── show-affiliate-level-in-admin-list.php ├── pmpro-approvals │ ├── add-birthday-column-to-approvals-admin-screen.php │ ├── add-custom-fields-to-approvals-admin-emails.php │ ├── add-email-confirmation-column.php │ ├── approve-user-added-by-admin.php │ ├── approve-user-if-already-approved.php │ └── different-email-per-level-approved.php ├── pmpro-buddypress │ ├── adjust-membership-tab-on-bp-profile.php │ ├── buddypress-approvals-profile-fields-view.php │ └── sync-buddypress-fields.php ├── pmpro-courses │ ├── add-custom-column-counting-users-finished-lessons-and-courses.php │ ├── remove-lesson-list-from-single-course.php │ └── sell-courses-addon-packages.php ├── pmpro-gift-levels │ └── remove-gift-only-levels-from-table.php ├── pmpro-google-analytics │ ├── add-custom-user-field-to-track.php │ ├── capture-unique-post-data.php │ ├── exclude-users-based-on-roles.php │ ├── remove-element-from-default-dimensions-array.php │ └── track-custom-page.php ├── pmpro-group-accounts │ ├── migrate_pmprosm_to_pmprogroupacct.php │ ├── my_pmprogroupacct_enforce_same_email_domain.php │ └── my_pmprogroupacct_require-child-level-with-code.php ├── pmpro-homepages │ └── member-homepage-id.php ├── pmpro-import-users-from-csv │ └── welcome-email.php ├── pmpro-limit-logins │ ├── my_pmpro_limit_logins_number_simultaneous_logins.php │ └── my_pmpro_limit_logins_simultaneous_logins_based_on_level.php ├── pmpro-limit-post-views │ ├── always-restrict-posts.php │ ├── countdown-banner.php │ ├── limit-views-more-post-types.php │ ├── no-redirect-blur-overlay-banner.php │ └── views-used-banner.php ├── pmpro-local-pricing │ └── allow-discount-code-based-on-location.php ├── pmpro-mailchimp │ ├── send-enddate-to-mailchimp.php │ ├── send-shipping-fields-mailchimp.php │ └── unsubscribe-user-on-deletion-mailchimp.php ├── pmpro-member-rss │ └── add-member-rss-feed.php ├── pmpro-membership-card │ ├── custom-pmpro-membership-card-qr-code-size.php │ ├── my-pmpro-membership-card-override-template.php │ ├── pmpro-qr-data-other-filter.php │ ├── qr-code-return-membership-info.php │ ├── qr-code-return-membership-profile.php │ └── show-member-number-on-membership-card.php ├── pmpro-membership-directory │ ├── README.md │ ├── append-cf7-membership-profile.php │ ├── display-linked-child-accounts-on-parent-profile.php │ ├── pmpro-directory-sort-last-name.php │ ├── pmpromd-disable-oembed.php │ ├── pmpromd-hide-empty-elements.php │ ├── pmpromd-make-clickable.php │ ├── pmpromd-mask-phone-number-field-for-non-members.php │ └── sort-pmpro-member-directory-order-by-custom-user-meta-field.php ├── pmpro-membership-maps │ ├── add-widget-filter-member-maps-location-distance.php │ ├── adds-address-fields-to-the-add-member-from-admin-page.php │ ├── custom-billing-fields-geocode-on-checkout.php │ ├── mypmpromm-custom-billing-save-profile.php │ ├── styling-membership-map-using-google-maps.php │ └── use-custom-geocode-key.php ├── pmpro-multiple-memberships-per-user │ └── README.md ├── pmpro-nav-menus │ └── pmpro-nav-menus-mmpu-priority-level.php ├── pmpro-reports-dashboard │ └── pmpro-reports-dashboard-filter-reports.php ├── pmpro-roles │ ├── README.md │ ├── block-dashboard-access-for-additional-user-roles.php │ ├── bulk-update-roles-admin-script.php │ └── custom-pmpro-roles-update-caps.php ├── pmpro-series │ ├── allow-series-take-new-post-types.php │ ├── limit-posts-pmpro-series.php │ └── member-unsubscribe-from-new-series-post-emails.php ├── pmpro-set-expiration-dates │ └── change-year-by-month.php ├── pmpro-sponsored-members │ ├── generate-sponsor-code-for-existing-parent-members.php │ ├── pmpro-sponsored-members-add-additional-fields-to-child-accounts.php │ └── show-sponsored-child-accounts-pmpro-member-profile.php ├── pmpro-subscription-delays │ ├── remove-subscription-delay-for-members.php │ └── subscription-delay-one-time-credit-card-required-trial.php ├── pmpro-userpages │ ├── email-member-when-user-page-is-updated.php │ └── only-one-user-page-only.php ├── pmpro-vat-tax │ ├── README.md │ ├── remove-uk-from-eu.php │ └── show-adjusted-billing-for-eu-tax.php ├── pmpro-woocommerce │ ├── add-members-account-tab-to-woo.php │ ├── hide-prices-from-non-members.php │ ├── only-discount-regular-price-items.php │ ├── restrict-woocommerce-shop-to-specific-levels.php │ ├── set-ebook-category-member-price-to-free.php │ ├── set-variable-product-pricing-per-level.php │ ├── stop-non-pmpro-members-from-buying-woo-catagory.php │ ├── strike-through-pricing-woocommerce.php │ └── tease-membership-price-to-non-members.php ├── pmpro-zapier │ ├── README.md │ ├── add-group-account-code-zapier.php │ ├── add-sponsored-discount-code-zapier.php │ ├── send-billing-country-zapier.php │ └── send-user-fields-after-checkout.php ├── register-helper │ └── custom-user-avatars-register-helper.php └── wp-bouncer │ └── my_wp_bouncer_number_simultaneous_logins.php ├── admin-pages ├── README.md ├── add-custom-column-to-memberlist.php ├── add-quarterly-membership-level-template.php ├── add-report-widgets-to-dashboard.php ├── create-custom-report.php ├── remove-membership-level-templates-from-popup.php ├── requires-membership-column-categories.php ├── requires-membership-column-pages.php ├── requires-membership-column-posts.php ├── show-billing-address-members-list.php ├── show-membership-number-members-list.php ├── show-next-last-payment-dates-members-list.php └── show-renewal-date-orders-list.php ├── block-templates ├── README.md └── redirect-member-on-login.html ├── blocks-shortcodes ├── README.md ├── member-count-shortcode.php └── member-directory-search-shortcode.php ├── checkout ├── README.md ├── add-australian-gst.php ├── add-cc-and-paypal-logos-checkout-page.css ├── add-cc-logos-checkout-page.php ├── add-fixed-fee-stripe.php ├── add-level-specific-fee-to-checkout.php ├── add-multiple-required-consent-boxes-at-checkout.php ├── add-new-default-currency.php ├── add-select-payment-plan-box-membership-checkout.php ├── add-text-before-submit-on-checkout.php ├── adjust-default-currency-format.php ├── allow-expiring-members-extend-renewal-change.php ├── autofill-billing-fields-from-woocommerce.php ├── basic-hcaptcha-implementation.php ├── custom-tax-example.php ├── customize-membership-confirmation-message.php ├── email-only-checkout.php ├── format_phone_field.php ├── generate-user-data-from-billing-information.php ├── generate-username-from-email-pmpro.php ├── hide-confirm-email-password.php ├── keep-startdate-on-level-change-at-checkout.php ├── load-css-for-checkout-page.php ├── load-custom-TOS-by-level.php ├── membership-duration-checkout-field.php ├── modify-level-price-based-selections.php ├── mypmpromm-custom-billing-add-fields.php ├── name-email-only-checkout.php ├── non-us-taxes.php ├── pmpro-processing-message-css-animated-bars.php ├── redirect-members-unique-confirmation-page-checkout-level.php ├── remove-custom-trial-for-existing-members.php ├── restrict-checkout-by-countries.php ├── restrict-checkout-by-email-domain.php ├── restrict-checkout-by-email-or-username.php ├── restrict-terms-in-usernames.php ├── run-order-creation-checks-before-user-creation.php ├── select-offline-payment-type-check-gateway.php ├── sell-a-la-carte-access-to-cats.php ├── set-display-name-to-username-new-user-array.php ├── set-pmpro-default-country.php ├── stop-members-from-renewing-specific-level.php ├── stop-members-from-renewing.php ├── terms-of-service-as-a-link-only.php ├── terms-of-service-show-todays-date.php ├── terms-of-service-with-page-contents.php ├── update-level-cost-with-tax.php └── user-fields-additional-content-at-checkout.code.php ├── discount-codes ├── README.md ├── add-description-to-checkout-field-for-admin.php ├── automatically-add-discount-code.php ├── create-discount-code-for-expired-members.php ├── create-discount-code-for-use-once-per-user.php ├── new-user-only-discount-code.php └── restrict-discount-code-by-email.php ├── email ├── README.md ├── bcc-admin-email-for-a-level.php ├── bcc-email-addresses-on-notifications.php ├── change-pmpro-email-subjects.php ├── disable-all-pmpro-email.php ├── disable-emails-by-level.php ├── membership-expiring-email-add-renewal-link-to-login-url.php ├── membership-level-name-to-email-expire-template.php ├── pmpro-email-headers-member-email.php ├── remove-user-fields-from-admin-email.php ├── send-additional-admin-activity-emails.php ├── send-additional-recurring-payment-reminder-emails.php └── show-membership-number-in-confirmation-email.php ├── frontend-pages ├── README.md ├── add-data-invoice-bullets.php ├── add-level-name-checkout-attribute-seo.php ├── add-level-name-checkout-title-seo.php ├── add-manage-paypal-subscription-membership-account-action-link.php ├── add-members-links-to-members-account-page.php ├── add-membership-level-action-links.php ├── add-mycred-points-at-checkout.php ├── add-pmpro-level-id-to-body-class.php ├── add-user-id-to-members-account-page.php ├── change-profile-action-links.php ├── filter-pmpro-levels-page-levels.php ├── hide-levels-from-levels-page-by-id.php ├── link-to-author-archive-pmpro-member-profile-after.php ├── remove-profile-action-links.php ├── remove-rename-user-fields-member-profile-edit.php ├── show-gravatar-on-account-page.php ├── show-level-levels-page-custom-setting.php ├── show-membership-number-on-account-page.php ├── show-membership-number-on-invoice-page.php ├── show-next-payment-date-on-account-page.php ├── show-pmpro-pages-in-search.php ├── show-wp-id-on-account-page.php └── woocommerce-billing-fields-pmpro-invoice.php ├── import-export └── README.md ├── integration-compatibility ├── README.md ├── my-bricks-show-content-for-pmpro-levels.php ├── my-pmpro-load-shortcode-for-bricks.php ├── pmpro-elementor-allow-access-for-admins.php └── require-custom-level-group-elementor.php ├── license.txt ├── localization └── README.md ├── memberlite ├── memberlite-adjust-defaults-background-css-selectors.php ├── memberlite-banner-expiration-notification.php ├── memberlite-hide-author-avatars-from-loop.php ├── memberlite-modify-blog-columns-ratio.php ├── memberlite-modify-custom-post-type-columns-ratio.php ├── memberlite-modify-post-entry-meta.php ├── memberlite-remove-archive-prefix-from-masthead.php ├── memberlite-remove-enlarged-font-for-excerpt.php ├── memberlite-remove-home-from-breadcrumbs.php ├── memberlite-remove-selector-from-memberlite-defaults.php ├── memberlite-shortcodes-example-accordion.php ├── memberlite-shortcodes-example-button.php ├── memberlite-shortcodes-example-columns.php ├── memberlite-shortcodes-example-font-awesome-icon.php ├── memberlite-shortcodes-example-message.php ├── memberlite-shortcodes-example-recent-posts.php ├── memberlite-shortcodes-example-subpagelist.php ├── memberlite-shortcodes-example-tabs.php ├── memberlite-sitewide-signup-banner-example-1.php ├── memberlite-sitewide-signup-banner-example-2.php └── memberlite-sitewide-signup-banner-example-3.php ├── membership-levels ├── README.md ├── add-grace-to-membership-level.php ├── automatically-assign-level-during-registration.php ├── cancel-membership-level-immediately.php ├── change-membership-level-on-cancellation-expiration-allow-default-cancel.php ├── change-membership-level-on-cancellation-expiration.php ├── change-membership-level-on-expiration-only.php ├── database-script-apply-membership-level-users-without-level.sql ├── keep-free-members-in-old-members-list.php ├── limit-members-level.php ├── offer-trial-memberships-only-used-once.php ├── restrict-access-for-cpt-categories.php ├── translate-membership-levels.php └── unlock-membership-access-without-updating-posts.php ├── misc ├── README.md ├── add-gtm-script-to-wordpress-site.php ├── allow-weak-passwords.php ├── change-wp-display-name-first-last-option-1.php ├── change-wp-display-name-first-last-option-2.php ├── changing-membership-subscription-wording.php ├── delete-wp-user-when-member-cancels.php ├── first-time-login-redirect.php ├── generate-unique-membership-number.php ├── hide-show-profile-fields-based-on-level.php ├── login-hide-username-email-in-errors.php ├── my-pmpro-assign-level-to-role.php ├── mypmpro-affwp-member-link.php ├── pmpro-at-scale-show-admins-only-in-delete-user-attribute-content-dropdown.php ├── pmpro-disable-https-redirect.php ├── pmpro-disable-register-redirect.php ├── pmpro-expire-soon-banner.php ├── pmpro-force-ssl-checkout.php ├── pmpro-skip-admin-tracking.php ├── pmpro_has_membership_access_filter_for_authors.php ├── redirect-member-on-login.php ├── redirect-member-on-logout.php ├── require-confirmed-email-address-to-login.php ├── restrict-user-login-to-active-members.php ├── return-active-members-with-usermeta-for-level-id.php ├── send-custom-dimensions-to-gtm-datalayer.php ├── send-ecommerce-events-to-gtm.php ├── shop-login-link-when-using-membership-shortcode.php └── show-membership-level-for-comment-author.php ├── orders ├── add-mycred-points-whenever-order-created.php ├── add-refund-reason-order-meta-field.php └── custom-pmpro-order-codes.php ├── payment-gateways ├── authorize.net │ └── authorizenet-sent-ip.php ├── braintree │ └── add-merchant-account-id-to-braintree-sale-array.php ├── cancel-on-billing-failure.php ├── paypal │ └── forward-pmpro-ipn-to-another-domain.php └── stripe │ ├── adjust-stripe-connect-fee.php │ ├── load-stripe-library-earlier.php │ ├── show-checkout-session-id.php │ └── stripe-checkout-locale.php ├── restricting-content ├── README.md ├── add-member-categories-back-to-loop.php ├── allow-access-for-admins.php ├── allow-access-for-pending-orders.php ├── change-level-edd-update-payment-status.php ├── check-default-level-on-new-post.php ├── filter-pmpro-no-access-message-body.php ├── filter-pmpro-no-access-message-header.php ├── filter-text-for-logged-out-visitors.php ├── filter-text-for-non-logged-in-member.php ├── lock-down-everything-but-homepage.php ├── lockdown-everything-except-homepage.php ├── pause-member-access.php ├── redirect-empty-category-archive.php ├── redirect-non-members-away-from-member-content.php ├── redirect-non-members-away-from-urls.php ├── remove-no-access-message-from-homepage.php ├── restrict-by-custom-taxonomy.php ├── restrict-comments-to-members-only.php └── unlock-post-by-ID-on-specifc-date.php └── user-fields ├── add-billing-address-to-user-profile-edit-page.php ├── add-conditional-referred-by-user-field.php ├── add-mmpu-level-based-on-checkout-field.php ├── add-user-fields.php ├── change-user-field-type-by-role.php ├── custom-user-taxonomy-field.php ├── frontend-profile-require-user-fields.php ├── save-function-add-user-field-filter.php ├── save-function-custom-callback.php ├── save-function-must-love-dogs-example.php └── update-price-by-conditional-user-field.php /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /add-ons/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /add-ons/convertkit-paid-memberships-pro/remove-tags-after-level-change.php: -------------------------------------------------------------------------------- 1 | 26 | 35 | array( 22 | 'class' => array(), 23 | ), 24 | 'h2' => array(), 25 | ); 26 | 27 | $allowed_html = array_merge( $allowed_html, $html ); 28 | 29 | return $allowed_html; 30 | } 31 | add_filter( 'pmproal_allowed_html', 'my_pmproal_allow_html_tags' ); -------------------------------------------------------------------------------- /add-ons/pmpro-approvals/add-birthday-column-to-approvals-admin-screen.php: -------------------------------------------------------------------------------- 1 | Settings > User Fields screen. 6 | * 7 | * title: Add birthday field to Approvals admin screen 8 | * layout: snippet 9 | * collection: add-ons 10 | * category: pmpro-approvals 11 | * 12 | * You can add this recipe to your site by creating a custom plugin 13 | * or using the Code Snippets plugin available for free in the WordPress repository. 14 | * Read this companion article for step-by-step directions on either method. 15 | * https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ 16 | */ 17 | 18 | /** 19 | * Add a column header for 'birthday' to the Memberships > Approvals admin screen. 20 | */ 21 | function my_pmpro_approvals_list_extra_cols_header( $theuser ) { 22 | echo 'Birthday'; 23 | } 24 | add_action( 'pmpro_approvals_list_extra_cols_header', 'my_pmpro_approvals_list_extra_cols_header' ); 25 | 26 | /** 27 | * Populate the 'birthday' column with user data. 28 | */ 29 | function my_pmpro_approvals_list_extra_cols_body( $theuser ) { 30 | echo '' . get_user_meta( $theuser->ID, 'birthday', true ) . ''; 31 | } 32 | add_action( 'pmpro_approvals_list_extra_cols_body', 'my_pmpro_approvals_list_extra_cols_body' ); 33 | -------------------------------------------------------------------------------- /add-ons/pmpro-approvals/approve-user-added-by-admin.php: -------------------------------------------------------------------------------- 1 | template == 'application_approved' ) { 30 | 31 | if ( $email->data['membership_id'] == 1 ) { 32 | $email->subject = 'Your Membership 1 Has Been Approved'; 33 | $email->body = 'This is the content/body of the email for members who are approved for level 1'; 34 | } 35 | 36 | if ( $email->data['membership_id'] == 2 ) { 37 | $email->subject = 'Your Membership 2 Has Been Approved'; 38 | $email->body = 'This is the content/body of the email for members who are approved for level 2'; 39 | } 40 | } 41 | 42 | return $email; 43 | } 44 | add_filter( 'pmpro_email_filter', 'my_pmpro_approval_email_filter', 99, 1 ); 45 | -------------------------------------------------------------------------------- /add-ons/pmpro-buddypress/adjust-membership-tab-on-bp-profile.php: -------------------------------------------------------------------------------- 1 | BuddyPress XProfile Field. Adjust this array for each field you need to map. 17 | $buddypress_mapping = array( 18 | 'company' => 'Company', 19 | 'referral' => 'Referral' 20 | ); 21 | 22 | // Loop through the above array and add the buddypress field to the existing PMPro User Field. 23 | foreach( $buddypress_mapping as $user_field => $buddypress_field ) { 24 | if ( $field->name === $user_field ) { 25 | $field->buddypress = $buddypress_field; 26 | } 27 | } 28 | 29 | return $field; 30 | } 31 | add_filter( 'pmpro_add_user_field', 'my_pmpro_add_buddypress_to_existing_fields', 10, 2 ); -------------------------------------------------------------------------------- /add-ons/pmpro-courses/remove-lesson-list-from-single-course.php: -------------------------------------------------------------------------------- 1 | ID; 24 | $is_course = get_post_meta( $post_id, '_post_courses', true ); 25 | $ap_posts = get_user_meta( $myuser->ID, '_pmproap_posts', true ); 26 | 27 | // Bail if nothing is found and return current access. 28 | if ( empty( $ap_posts ) || empty( $is_course ) ) { 29 | return $hasaccess; 30 | } 31 | 32 | if ( in_array( $is_course[0], $ap_posts ) ) { 33 | $hasaccess = true; 34 | } 35 | 36 | return $hasaccess; 37 | } 38 | add_filter( 'pmpro_has_membership_access_filter', 'pmpro_give_access_to_users_for_course', 10, 4 ); 39 | -------------------------------------------------------------------------------- /add-ons/pmpro-gift-levels/remove-gift-only-levels-from-table.php: -------------------------------------------------------------------------------- 1 | roles; 24 | 25 | return ! empty( array_intersect( $roles, $roles_to_hide ) ); 26 | } 27 | add_filter( 'pmproga4_dont_track', 'my_custom_pmproga4_dont_track_by_role' ); 28 | -------------------------------------------------------------------------------- /add-ons/pmpro-google-analytics/remove-element-from-default-dimensions-array.php: -------------------------------------------------------------------------------- 1 | id, $required_levels ) && empty( $_REQUEST['pmprogroupacct_group_code'] ) ) { 24 | pmpro_setMessage("You must use a valid group code to register for this level.", "pmpro_error"); 25 | return false; 26 | } 27 | 28 | return $pmpro_continue_registration; 29 | } 30 | add_filter( 'pmpro_registration_checks', 'my_pmpro_require_group_code_to_register' ); -------------------------------------------------------------------------------- /add-ons/pmpro-homepages/member-homepage-id.php: -------------------------------------------------------------------------------- 1 | ID, $restricted_post_ids ) ) { 29 | return false; 30 | } 31 | 32 | // Otherwise, return the original value. 33 | return $allow_free_views; 34 | } 35 | add_filter( 'pmprolpv_has_membership_access', 'my_pmprolpv_always_restrict_posts', 10, 2 ); 36 | -------------------------------------------------------------------------------- /add-ons/pmpro-limit-post-views/limit-views-more-post-types.php: -------------------------------------------------------------------------------- 1 | 'CANADA10', 20 | // 'ZA' => 'LEKKER', 21 | ); 22 | return $country_discount_codes; 23 | } 24 | add_filter( 'pmpro_local_pricing_discounted_countries', 'my_pmpro_local_pricing_discount_codes_by_country' ); 25 | -------------------------------------------------------------------------------- /add-ons/pmpro-mailchimp/send-enddate-to-mailchimp.php: -------------------------------------------------------------------------------- 1 | ID ); 19 | $expiration_date = 'Never'; 20 | 21 | // Update variable value if level has an expiration date 22 | if ( ! empty( $level->enddate ) ) { 23 | $expiration_date = date( get_option( 'date_format' ), $level->enddate ); 24 | } 25 | 26 | // Create new ENDDATE field 27 | $new_fields = array( 28 | 'ENDDATE' => $expiration_date, 29 | ); 30 | 31 | // join existing fields with new fields 32 | $fields = array_merge( $fields, $new_fields ); 33 | 34 | return $fields; 35 | } 36 | add_action( 'pmpro_mailchimp_listsubscribe_fields', 'my_pmpro_mailchimp_add_enddate_to_merge_fields', 10, 2 ); 37 | 38 | /* 39 | (Optional) Tell PMPro MailChimp to always synchronize user profile updates. By default it only synchronizes if the user's email has changed. 40 | Requires PMPro Mailchimp v2.0.3 or higher. 41 | */ 42 | 43 | add_filter( 'pmpromc_profile_update', '__return_true' ); 44 | -------------------------------------------------------------------------------- /add-ons/pmpro-mailchimp/unsubscribe-user-on-deletion-mailchimp.php: -------------------------------------------------------------------------------- 1 | user_login . '/feed/' ) ); 23 | 24 | // Recent posts from "members" category. 25 | $feeds['Members Feed'] = pmpromrss_url( home_url( '/category/members/feed' ) ); 26 | 27 | return $feeds; 28 | 29 | } 30 | add_action('pmpromrss_feeds', 'my_pmpromrss_feeds'); -------------------------------------------------------------------------------- /add-ons/pmpro-membership-card/custom-pmpro-membership-card-qr-code-size.php: -------------------------------------------------------------------------------- 1 | membership_level ) ) { 23 | $return_value['first_name'] = $member->first_name; 24 | $return_value['last_name'] = $member->last_name; 25 | $return_value['membership_name'] = $member->membership_level->name; 26 | $return_value['membership_expiration'] = $member->membership_level->enddate; 27 | $return_value['date_of_query'] = date_i18n( "Y-m-d H:i s" , date( 'y-m-d h:i:s' ) ); 28 | } else { 29 | $return_value['membership_name'] = "No membership"; 30 | } 31 | return json_encode( $return_value, JSON_UNESCAPED_UNICODE ); 32 | } 33 | } 34 | add_filter( 'pmpro_membership_card_qr_data_other', 'qr_code_return_membership_info', 10, 2 ); 35 | -------------------------------------------------------------------------------- /add-ons/pmpro-membership-card/qr-code-return-membership-profile.php: -------------------------------------------------------------------------------- 1 | user_nicename ) ){ 26 | return pmpromd_build_profile_url( $pmpro_membership_card_user ); 27 | } 28 | } 29 | 30 | } 31 | add_filter( 'pmpro_membership_card_qr_data_other', 'mypmro_membership_card_qr_data_profile_url', 10, 2 ); -------------------------------------------------------------------------------- /add-ons/pmpro-membership-card/show-member-number-on-membership-card.php: -------------------------------------------------------------------------------- 1 | ID, 'member_number', true ); 26 | 27 | if ( empty( $member_id ) ) { 28 | // lets generate it on the fly. 29 | $member_id = generate_member_number( $user->ID ); 30 | } 31 | 32 | echo '

Membership Number: ' . esc_html( $member_id ) . '

'; 33 | 34 | } 35 | add_action( 'pmpro_membership_card_after_card', 'my_show_member_number_on_card' ); 36 | -------------------------------------------------------------------------------- /add-ons/pmpro-membership-directory/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /add-ons/pmpro-membership-directory/pmpro-directory-sort-last-name.php: -------------------------------------------------------------------------------- 1 | name ) && $field->name === 'youtube_video' ) { 21 | return 'clickable_link'; 22 | } 23 | return $link_display_type; 24 | } 25 | add_filter( 'pmpro_field_value_link_display_type', 'my_pmpro_field_value_link_display_type', 10, 3 ); 26 | -------------------------------------------------------------------------------- /add-ons/pmpro-membership-directory/pmpromd-hide-empty-elements.php: -------------------------------------------------------------------------------- 1 | 4 ) { 29 | $maskLength = $length - 4; 30 | $masked_number = str_repeat( '*', $maskLength ) . substr( $numeric_value, -4 ); 31 | } else { 32 | // For short numbers, mask all digits. 33 | $masked_number = str_repeat( '*', $length ); 34 | } 35 | 36 | return $masked_number; 37 | } 38 | 39 | return $value; 40 | } 41 | add_filter( 'pmpromd_get_display_value', 'my_pmpromd_get_display_value_mask_phone_field', 10, 4 ); 42 | -------------------------------------------------------------------------------- /add-ons/pmpro-membership-maps/use-custom-geocode-key.php: -------------------------------------------------------------------------------- 1 | roles ) ) ) { 26 | $block = true; 27 | } 28 | 29 | return $block; 30 | } 31 | add_filter( 'pmpro_block_dashboard', 'block_dashboard_for_custom_role' ); 32 | -------------------------------------------------------------------------------- /add-ons/pmpro-roles/custom-pmpro-roles-update-caps.php: -------------------------------------------------------------------------------- 1 | add_cap( 'delete_posts', true ); 31 | $role->add_cap( 'edit_posts', true ); 32 | $role->add_cap( 'read', true ); 33 | } 34 | add_action( 'init', 'custom_pmpro_roles_update_caps' ); 35 | -------------------------------------------------------------------------------- /add-ons/pmpro-series/allow-series-take-new-post-types.php: -------------------------------------------------------------------------------- 1 | ID ); 24 | $posts_to_display = array(); 25 | 26 | foreach ( $post_list as $sp ) { 27 | $posts_to_display[] = $sp; 28 | if ( max( 0, $member_days ) < $sp->delay ) { 29 | break; 30 | } 31 | } 32 | 33 | return $posts_to_display; 34 | } 35 | add_filter( 'pmpro_series_post_list_posts', 'my_pmpro_series_limit_posts_shown', 10, 2 ); 36 | -------------------------------------------------------------------------------- /add-ons/pmpro-series/member-unsubscribe-from-new-series-post-emails.php: -------------------------------------------------------------------------------- 1 | data['user_login'] ); 20 | if ( $email->template == 'new_content' && '1' === $user->disable_pmpro_series_email_notifications ) { 21 | $recipient = null; 22 | } 23 | return $recipient; 24 | } 25 | add_filter( 'pmpro_email_recipient', 'my_pmpro_disable_series_new_content_email_by_usermeta', 10, 2 ); 26 | -------------------------------------------------------------------------------- /add-ons/pmpro-set-expiration-dates/change-year-by-month.php: -------------------------------------------------------------------------------- 1 | format('n'); 30 | 31 | /** 32 | * Check if the month is October (month number 10) or later and update the Expiration Date to be 1 year later. 33 | * This will keep the month and day in tact. 34 | */ 35 | if ( $month >= 10 ) { 36 | // str_replace 'Y1' with the 'Y2' 37 | $raw_date = str_replace( 'Y1', 'Y2', $raw_date ); // Here you may adjust the date format to your needs. 38 | } 39 | 40 | return $raw_date; 41 | } 42 | add_filter( 'pmprosed_expiration_date_raw', 'my_pmpro_programmatically_change_set_expiration_date', 10, 1 ); 43 | -------------------------------------------------------------------------------- /add-ons/pmpro-sponsored-members/show-sponsored-child-accounts-pmpro-member-profile.php: -------------------------------------------------------------------------------- 1 | ID ); 17 | 18 | if ( empty( $sponsored_ids ) ) { 19 | return; 20 | } 21 | 22 | $sponsored_list = new WP_User_Query( 23 | array( 24 | 'include' => $sponsored_ids, 25 | 'orderby' => 'name', 26 | 'order' => 'ASC', 27 | ) 28 | ); 29 | 30 | $sponsored_members = $sponsored_list->get_results(); 31 | if ( ! empty( $sponsored_members ) ) { 32 | echo 'Sponsored Members'; 33 | echo ''; 38 | } 39 | } 40 | add_action( 'pmpro_member_profile_after', 'show_sponsored_child_accounts_pmpro_member_profile_after' ); 41 | -------------------------------------------------------------------------------- /add-ons/pmpro-userpages/only-one-user-page-only.php: -------------------------------------------------------------------------------- 1 | get_sale_price(); 23 | 24 | if ( ! $product->is_on_sale() ) { 25 | //Its not on sale, so we can discount it 26 | return $discount_price; 27 | } 28 | 29 | //On sale, dont discount it further 30 | return $sale_price; 31 | 32 | } 33 | add_filter( 'pmprowoo_get_membership_price', 'mypmpro_discount_sales', 10, 4 ); 34 | -------------------------------------------------------------------------------- /add-ons/pmpro-woocommerce/restrict-woocommerce-shop-to-specific-levels.php: -------------------------------------------------------------------------------- 1 | code; 31 | } 32 | 33 | return $data; 34 | } 35 | add_filter( 'pmproz_after_checkout_data', 'my_pmpro_add_sponsored_code_zapier', 10, 4 ); 36 | -------------------------------------------------------------------------------- /add-ons/pmpro-zapier/send-billing-country-zapier.php: -------------------------------------------------------------------------------- 1 | Add New admin popup. 8 | * layout: snippet 9 | * collection: admin-pages 10 | * category: membership-levels 11 | * 12 | * You can add this recipe to your site by creating a custom plugin 13 | * or using the Code Snippets plugin available for free in the WordPress repository. 14 | * Read this companion article for step-by-step directions on either method. 15 | * https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ 16 | */ 17 | 18 | /** 19 | * Remove the "trial" template or unset all templates from the Membership Levels > Add New popup. 20 | * 21 | */ 22 | function remove_template_pmpro_membershiplevels_templates( $level_templates ) { 23 | // Remove the "Trial" level template. 24 | unset( $level_templates['trial'] ); 25 | 26 | // Remove all level templates. 27 | //$level_templates = array(); 28 | 29 | return $level_templates; 30 | } 31 | add_filter( 'pmpro_membershiplevels_templates', 'remove_template_pmpro_membershiplevels_templates' ); 32 | -------------------------------------------------------------------------------- /block-templates/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /blocks-shortcodes/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /checkout/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /checkout/add-fixed-fee-stripe.php: -------------------------------------------------------------------------------- 1 | initial_payment = $level->initial_payment + 3; //Updates initial payment value 20 | $level->billing_amount = $level->billing_amount + 3; //Updates recurring payment value 21 | } 22 | } 23 | return $level; 24 | } 25 | add_filter( "pmpro_checkout_level", "my_pmpro_checkout_level" ); 26 | -------------------------------------------------------------------------------- /checkout/add-new-default-currency.php: -------------------------------------------------------------------------------- 1 | information to your site for you.'; 18 | } 19 | 20 | add_action( 'pmpro_checkout_before_submit_button', 'add_text_before_submit' ); 21 | -------------------------------------------------------------------------------- /checkout/adjust-default-currency-format.php: -------------------------------------------------------------------------------- 1 | __( 'Danish Krone', 'paid-memberships-pro' ), 28 | 'decimals' => '2', 29 | 'thousands_separator' => ' ', 30 | 'decimal_separator' => ',', 31 | 'symbol' => 'DKK ', 32 | 'position' => 'left', 33 | ); 34 | 35 | return $pmpro_currencies; 36 | 37 | } 38 | add_filter( 'pmpro_currencies', 'pmpro_eu_dkk_format' ); 39 | -------------------------------------------------------------------------------- /checkout/customize-membership-confirmation-message.php: -------------------------------------------------------------------------------- 1 | This is a new confirmation message.

'; 18 | 19 | return $confirmation_message; 20 | } 21 | add_filter( 'pmpro_confirmation_message', 'my_pmpro_confirmation_message', 15, 2 ); 22 | -------------------------------------------------------------------------------- /checkout/hide-confirm-email-password.php: -------------------------------------------------------------------------------- 1 | id, $user_id ) ) { 28 | $sql_query = "SELECT UNIX_TIMESTAMP(startdate) FROM $wpdb->pmpro_memberships_users WHERE user_id = '" . esc_sql( $user_id ) . "' AND status = 'active' ORDER BY id LIMIT 1"; 29 | $old_timestamp = $wpdb->get_var( $sql_query ); 30 | 31 | if ( ! empty( $old_timestamp ) ) { 32 | $startdate = gmdate( 'Y-m-d H:i:s', $old_timestamp ); 33 | } 34 | } 35 | 36 | return $startdate; 37 | } 38 | add_action( 'pmpro_checkout_start_date', 'my_pmpro_checkout_start_date', 15, 3 ); 39 | -------------------------------------------------------------------------------- /checkout/load-css-for-checkout-page.php: -------------------------------------------------------------------------------- 1 | id ); // Get level ID. 26 | 27 | if ( is_page( $pmpro_pages['checkout'] ) && $level_id === 1 ) { 28 | ?> 29 | 33 | id ) ) { 26 | if ( $pmpro_level->id == 1 ) { 27 | $tospage = 53; // change this 28 | } else { 29 | $tospage = 55; 30 | } 31 | } 32 | 33 | return $tospage; 34 | } 35 | add_filter( 'option_pmpro_tospage', 'my_option_pmpro_tospage' ); 36 | -------------------------------------------------------------------------------- /checkout/modify-level-price-based-selections.php: -------------------------------------------------------------------------------- 1 | initial_payment = $level->initial_payment + 100; 22 | //$level->billing_amount = $level->billing_amount + 100; //to update recurring payments too 23 | } 24 | 25 | return $level; 26 | } 27 | add_filter( "pmpro_checkout_level", "my_pmpro_checkout_level" ); 28 | -------------------------------------------------------------------------------- /checkout/redirect-members-unique-confirmation-page-checkout-level.php: -------------------------------------------------------------------------------- 1 | id ) { 19 | $rurl = 'http://example.com/page_1'; 20 | } elseif ( '2' === $pmpro_level->id ) { 21 | $rurl = 'http://example.com/page_2'; 22 | } elseif ( '3' === $pmpro_level->id ) { 23 | $rurl = 'http://example.com/page_3'; 24 | } 25 | 26 | return $rurl; 27 | 28 | } 29 | 30 | add_filter( 'pmpro_confirmation_url', 'my_pmpro_confirmation_url', 10, 3 ); 31 | -------------------------------------------------------------------------------- /checkout/remove-custom-trial-for-existing-members.php: -------------------------------------------------------------------------------- 1 | id != '9' ) { 25 | return $level; 26 | } 27 | 28 | $level->trial_limit = '0'; 29 | $level->trial_amount = '0'; 30 | 31 | return $level; 32 | } 33 | add_filter( 'pmpro_checkout_level', 'my_pmpro_level_adjustment', 10, 1 ); 34 | -------------------------------------------------------------------------------- /checkout/run-order-creation-checks-before-user-creation.php: -------------------------------------------------------------------------------- 1 | gateway ) { 23 | return; 24 | } 25 | 26 | if ( isset( $_REQUEST['payment_type']) && 'other' !== $_REQUEST['payment_type'] ) { 27 | $order->payment_type = esc_attr( $_REQUEST['payment_type'] ); 28 | } 29 | 30 | $order->saveOrder(); 31 | } 32 | add_action( 'pmpro_added_order', 'my_pmpro_add_payment_type_to_order' ); 33 | -------------------------------------------------------------------------------- /checkout/set-display-name-to-username-new-user-array.php: -------------------------------------------------------------------------------- 1 | id; 31 | 32 | // Check if the user's current membership level is the same for checking out. 33 | if ( pmpro_hasMembershipLevel( $level_id ) ) { 34 | $okay = false; 35 | pmpro_setMessage( 'This is your current membership level. Please select a different membership level.', 'pmpro_error' ); 36 | } 37 | 38 | return $okay; 39 | 40 | } 41 | add_filter( 'pmpro_registration_checks', 'stop_members_from_renewing', 10, 1 ); 42 | -------------------------------------------------------------------------------- /checkout/terms-of-service-show-todays-date.php: -------------------------------------------------------------------------------- 1 | data['membership_id'] ) === 5 ) { 26 | $admin_email = 'someemail@email.com'; 27 | } 28 | 29 | // Add BCC only if the email isn't already going to the admin. 30 | if ( $email->email !== get_bloginfo( 'admin_email' ) ) { 31 | $headers[] = 'Bcc: ' . $admin_email; 32 | } 33 | 34 | return $headers; 35 | } 36 | add_filter( 'pmpro_email_headers', 'my_pmpro_email_headers', 10, 2 ); -------------------------------------------------------------------------------- /email/bcc-email-addresses-on-notifications.php: -------------------------------------------------------------------------------- 1 | template, '_admin' ) !== false ) { 24 | $headers[] = 'Bcc:' . 'otheremail@domain.com'; 25 | // $headers[] = 'Bcc:' . 'otheremail@domain.com,two@domain.com,three@domain.com'; //Example with multiple BCC emails 26 | } 27 | 28 | return $headers; 29 | } 30 | add_filter( 'pmpro_email_headers', 'my_pmpro_email_headers_admin_emails', 10, 2 ); 31 | -------------------------------------------------------------------------------- /email/change-pmpro-email-subjects.php: -------------------------------------------------------------------------------- 1 | template == 'checkout_free' ) { 19 | $subject = 'Thank you, ' . $email->data["name"] . ', for using ' . get_bloginfo( 'name' ); 20 | } 21 | 22 | return $subject; 23 | } 24 | 25 | add_filter( 'pmpro_email_subject', 'my_pmpro_email_subject', 10, 2 ); 26 | -------------------------------------------------------------------------------- /email/disable-all-pmpro-email.php: -------------------------------------------------------------------------------- 1 | data['user_login']); 21 | $levels = pmpro_getMembershipLevelsForUser( $user->ID ); 22 | $level_ids = empty( $levels ) ? array() : wp_list_pluck( $levels, 'id' ); 23 | 24 | if ( in_array( '1', $level_ids ) ) { 25 | return null; 26 | } 27 | 28 | return $recipient; 29 | } 30 | add_filter( 'pmpro_email_recipient', 'my_pmpro_disable_member_emails', 10, 2 ); 31 | -------------------------------------------------------------------------------- /email/pmpro-email-headers-member-email.php: -------------------------------------------------------------------------------- 1 | email != get_bloginfo( 'admin_email' ) ) { 19 | $headers[] = 'Bcc:' . get_bloginfo( 'admin_email' ); 20 | } 21 | 22 | return $headers; 23 | } 24 | add_filter( 'pmpro_email_headers', 'my_pmpro_email_headers', 10, 2 ); 25 | -------------------------------------------------------------------------------- /email/remove-user-fields-from-admin-email.php: -------------------------------------------------------------------------------- 1 | sendAdminActivity( 'day', 'example1@email.com' ); 21 | 22 | // Send an additional weekly activity email on Mondays to example2@email.com. 23 | if ( 'Mon' === date( 'D' ) ) { 24 | $admin_activity_email->sendAdminActivity( 'week', 'example2@email.com' ); 25 | } 26 | } 27 | add_action( 'pmpro_schedule_daily', 'my_pmpro_send_additional_admin_activity_emails' ); // PMPro versions with Action Scheduler 28 | add_action( 'pmpro_cron_admin_activity_email', 'my_pmpro_send_additional_admin_activity_emails', 12 ); // PMPro versions before Action Scheduler 29 | -------------------------------------------------------------------------------- /email/send-additional-recurring-payment-reminder-emails.php: -------------------------------------------------------------------------------- 1 | 'membership_recurring', 18 | 3 => 'membership_recurring', 19 | ); 20 | return $emails; 21 | } 22 | add_filter( 'pmpro_upcoming_recurring_payment_reminder', 'my_pmpro_upcoming_recurring_payment_reminder', 10 ); 23 | -------------------------------------------------------------------------------- /frontend-pages/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /frontend-pages/add-data-invoice-bullets.php: -------------------------------------------------------------------------------- 1 | ID, 'company', true ); 21 | 22 | // Add if meta is available 23 | if ( ! empty( $company ) ) { 24 | ?> 25 |
  • Company:
  • 26 | Attribute for SEO 4 | * 5 | * title: Add Level Name to Membership Checkout Attribute for SEO 6 | * layout: snippet 7 | * collection: frontend-pages 8 | * category: seo 9 | * link: https://www.paidmembershipspro.com/add-level-name-to-membership-checkout-page-title-for-seo/ 10 | * 11 | * You can add this recipe to your site by creating a custom plugin 12 | * or using the Code Snippets plugin available for free in the WordPress repository. 13 | * Read this companion article for step-by-step directions on either method. 14 | * https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ 15 | */ 16 | function my_pmpro_membership_checkout_title_parts( $title_parts ) { 17 | global $pmpro_pages, $pmpro_level; 18 | 19 | if ( ! empty( $pmpro_pages ) && is_page( $pmpro_pages['checkout'] ) && ! empty( $pmpro_level ) ) { 20 | $title_parts['title'] = $pmpro_level->name . ' – ' . $title_parts['title']; 21 | } 22 | 23 | return $title_parts; 24 | } 25 | add_filter( 'document_title_parts', 'my_pmpro_membership_checkout_title_parts', 20 ); 26 | -------------------------------------------------------------------------------- /frontend-pages/add-level-name-checkout-title-seo.php: -------------------------------------------------------------------------------- 1 | name; 23 | } 24 | return $title; 25 | } 26 | add_filter( 'the_title', 'my_pmpro_membership_checkout_page_title', 10, 2 ); 27 | -------------------------------------------------------------------------------- /frontend-pages/add-members-links-to-members-account-page.php: -------------------------------------------------------------------------------- 1 | format here ?> 23 |
  • My Member Link Top
  • 24 | format here ?> 34 |
  • My Member Link Bottom
  • 35 | My Memberships section. 4 | * 5 | * title: Add Member Action links on the Membership Account Page 6 | * layout: snippet 7 | * collection: frontend-pages 8 | * category: membership-action-links 9 | * link: https://www.paidmembershipspro.com/add-custom-links-to-my-memberships-dashboard/ 10 | * 11 | * You can add this recipe to your site by creating a custom plugin 12 | * or using the Code Snippets plugin available for free in the WordPress repository. 13 | * Read this companion article for step-by-step directions on either method. 14 | * https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ 15 | */ 16 | 17 | function my_pmpro_member_action_links( $links, $level_id ) { 18 | // Check if the member is on Level 2. 19 | if ( $level_id == 2 ) { 20 | // Add an Upgrade link to checkout for Level 3. 21 | $links['upgrade'] = '' . esc_html__( 'Upgrade to Pro Membership', 'my-text-domain' ) . ''; 22 | } 23 | 24 | // Example: Add a bonus link for Level ID 3. 25 | if ( $level_id == 3 ) { 26 | $links['bonuses'] = '' . esc_html__( 'View Your Exclusive Bonuses', 'my-text-domain' ) . ''; 27 | } 28 | 29 | return $links; 30 | } 31 | add_filter( 'pmpro_member_action_links', 'my_pmpro_member_action_links', 10, 2 ); 32 | -------------------------------------------------------------------------------- /frontend-pages/add-pmpro-level-id-to-body-class.php: -------------------------------------------------------------------------------- 1 | tag's "class" attribute. 4 | * 5 | * title: AAdd the member's level ID to the tag's "class" attribute. 6 | * layout: snippet 7 | * collection: frontend-pages 8 | * category: css 9 | * link: https://www.paidmembershipspro.com/add-the-members-level-id-to-the-body-class-for-level-specific-css-styles/ 10 | * 11 | * You can add this recipe to your site by creating a custom plugin 12 | * or using the Code Snippets plugin available for free in the WordPress repository. 13 | * Read this companion article for step-by-step directions on either method. 14 | * https://www.paidmembershipspro.com/create-a-plugin-for-pmpro-customizations/ 15 | */ 16 | function add_pmpro_level_id_to_body_class( $classes ) { 17 | global $current_user; 18 | if ( function_exists( 'pmpro_hasMembershipLevel' ) && pmpro_hasMembershipLevel() ) { 19 | $classes[] = 'pmpro-body-has-level-' . $current_user->membership_level->ID; 20 | } 21 | return $classes; 22 | } 23 | add_filter( 'body_class', 'add_pmpro_level_id_to_body_class' ); 24 | -------------------------------------------------------------------------------- /frontend-pages/add-user-id-to-members-account-page.php: -------------------------------------------------------------------------------- 1 | Member ID: ' . $current_user->ID . ''; 19 | } 20 | add_action( 'pmpro_account_bullets_top', 'pmpro_add_user_id_account' ); 21 | -------------------------------------------------------------------------------- /frontend-pages/filter-pmpro-levels-page-levels.php: -------------------------------------------------------------------------------- 1 | $level ) { 22 | if ( ! in_array( $level->id, $hiddenlevels ) ) { 23 | $newlevels[ $key ] = $level; 24 | } 25 | } 26 | return $newlevels; 27 | } 28 | add_filter( 'pmpro_levels_array', 'my_pmpro_levels_array' ); 29 | -------------------------------------------------------------------------------- /frontend-pages/remove-profile-action-links.php: -------------------------------------------------------------------------------- 1 | ' . get_avatar( $current_user->ID, 160 ) . ''; 18 | } 19 | add_action( 'pmpro_account_bullets_top', 'show_gravatar_pmpro_account_bullets_top' ); 20 | 21 | function show_gravatar_pmpro_account_bullets_bottom() { 22 | echo '
  • ' . __( 'Avatar', 'pmpro' ) . ': ' . __( 'Update at Gravatar.com', 'pmpro' ) . '
  • '; 23 | } 24 | add_action( 'pmpro_account_bullets_bottom', 'show_gravatar_pmpro_account_bullets_bottom' ); 25 | -------------------------------------------------------------------------------- /frontend-pages/show-membership-number-on-invoice-page.php: -------------------------------------------------------------------------------- 1 | user->ID, 'member_number', true ); 28 | 29 | // If no member number, create one. 30 | if ( empty( $member_number ) ) 31 | $member_number = generate_member_number( $pmpro_invoice->user->ID ); 32 | 33 | // Show the member number. 34 | if ( ! empty( $member_number ) ) { ?> 35 |
  • :
  • 36 | Member ID: ' . $current_user->ID . ''; 21 | } 22 | add_action( 'pmpro_account_bullets_top', 'pmpro_add_user_id_account' ); -------------------------------------------------------------------------------- /import-export/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /integration-compatibility/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /integration-compatibility/my-pmpro-load-shortcode-for-bricks.php: -------------------------------------------------------------------------------- 1 | 'levels', 26 | 'pmpro_billing' => 'billing', 27 | 'pmpro_cancel' => 'cancel', 28 | 'pmpro_checkout' => 'checkout', 29 | 'pmpro_confirmation'=> 'confirmation', 30 | 'pmpro_invoice' => 'invoice' 31 | ]; 32 | 33 | foreach ( $pmpro_shortcodes as $shortcode => $template ) { 34 | if ( ! shortcode_exists( $shortcode ) ) { 35 | add_shortcode( $shortcode, function() use ( $template ) { 36 | require_once PMPRO_DIR . "/preheaders/{$template}.php"; 37 | return pmpro_loadTemplate( $template, 'local', 'pages' ); 38 | }); 39 | } 40 | } 41 | } 42 | add_action( 'plugins_loaded', 'my_pmpro_force_register_shortcodes' ); -------------------------------------------------------------------------------- /integration-compatibility/pmpro-elementor-allow-access-for-admins.php: -------------------------------------------------------------------------------- 1 | 13 | [memberlite_accordion] 14 | [memberlite_accordion_item title="Accordion Item Title 1"]This is the first item in the list.[/memberlite_accordion_item] 15 | [memberlite_accordion_item title="Accordion Item Title 2"]This is the second item in the list.[/memberlite_accordion_item] 16 | [memberlite_accordion_item title="Accordion Item Title 3"]This is the third item in the list.[/memberlite_accordion_item] 17 | [memberlite_accordion_item title="Accordion Item Title 4"]This is the fourth item in the list.[/memberlite_accordion_item] 18 | [memberlite_accordion_item title="Accordion Item Title 5"]This is the fifth item in the list.[/memberlite_accordion_item] 19 | [/memberlite_accordion] 20 | -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-button.php: -------------------------------------------------------------------------------- 1 | 13 | [memberlite_btn style="success" href="/blog/" text="Success Button" target="self"] 14 | 15 | [memberlite_btn style="alert" href="/blog/" text="Alert Button" target="self"] 16 | 17 | [memberlite_btn style="error" href="/blog/" text="Error Button" target="self"] 18 | 19 | [memberlite_btn style="info" href="/blog/" text="Info Button" target="self"] 20 | 21 | [memberlite_btn style="link" href="/blog/" text="Link Button" target="self"] 22 | 23 | [memberlite_btn style="default" href="/blog/" text="Default Button" target="self"] 24 | 25 | [memberlite_btn style="primary" href="/blog/" text="Primary Button" target="self"] 26 | 27 | [memberlite_btn style="secondary" href="/blog/" text="Secondary Button" target="self"] 28 | 29 | [memberlite_btn style="action" href="/blog/" text="Action Button" target="self"] 30 | -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-columns.php: -------------------------------------------------------------------------------- 1 | 13 | 14 | [row] 15 | [col medium="4" class="bg_secondary"] 16 | 17 | 1/3 column 18 | 19 | [/col] 20 | [col medium="8" class="bg_primary"] 21 | 22 | 2/3 column 23 | 24 | [/col] 25 | [/row] 26 | 27 | [row] 28 | [col medium="6" class="bg_action"] 29 | 30 | 1/2 column 31 | 32 | [/col] 33 | [col medium="6" class="bg_primary"] 34 | 35 | 1/2 column 36 | 37 | [/col] 38 | [/row] 39 | 40 | [row] 41 | [col medium="6" medium_offset="3" class="bg_primary"] 42 | 43 | 1/2 centered column 44 | 45 | [/col] 46 | [/row] 47 | 48 | [row] 49 | [col medium="6" class="bg_primary"] 50 | 51 | 1/2 column 52 | 53 | [/col] 54 | [col medium="6" class="bg_primary"] 55 | 56 | [row_row] 57 | [col_col medium="4" class="bg_secondary"] 58 | 59 | Nested column 60 | 61 | [/col_col] 62 | [col_col medium="8" class="bg_action"] 63 | 64 | Nested column 65 | 66 | [/col_col] 67 | [/row_row] 68 | 69 | [/col] 70 | [/row] 71 | -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-font-awesome-icon.php: -------------------------------------------------------------------------------- 1 | 13 | [fa icon="heart" animate="beat"] 14 | 15 | [fa icon="sync" animate="spin"] 16 | 17 | [fa icon="arrow-right" rotate="90"] 18 | 19 | [fa icon="check-circle" color="success" size="lg"] 20 | 21 | [fa icon="exclamation-circle" color="error" size="2x"] 22 | -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-message.php: -------------------------------------------------------------------------------- 1 | 13 | [memberlite_msg style="default" text="Default Message"] 14 | 15 | [memberlite_msg style="success" text="Success Message"] 16 | 17 | [memberlite_msg style="alert" text="Alert Message"] 18 | 19 | [memberlite_msg style="error" text="Error Message"] 20 | 21 | [memberlite_msg style="info" text="Info Message"] 22 | -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-recent-posts.php: -------------------------------------------------------------------------------- 1 | 13 | [memberlite_recent_posts count="2" title="Recent Updates From Our Blog" subtitle="Recent posts to help you design, grow, and optimize your membership site." category_id="1"] -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-subpagelist.php: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 | [memberlite_subpagelist post_parent="255585" link="true" orderby="title" order="ASC" show="excerpt"] 16 | 17 | 18 | [memberlite_subpagelist link="false" show="content"] 19 | 20 | 21 | [memberlite_subpagelist meta_key="featured" link="true" link_text="" show="none" post_parent="-1"] 22 | -------------------------------------------------------------------------------- /memberlite/memberlite-shortcodes-example-tabs.php: -------------------------------------------------------------------------------- 1 | 13 | 14 | [memberlite_tabs items="Step 1,Step 2,Step 3"] 15 | [memberlite_tab item="Step 1"] 16 | 17 | Step 1: Create Account 18 | Click the button below to register. You will receive a welcome email with next steps. 19 | 20 | [/memberlite_tab] 21 | [memberlite_tab item="Step 2"] 22 | 23 | Step 2: Complete Profile 24 | Add a profile photo, bio, and any social links so other members can connect with you. 25 | 26 | [/memberlite_tab] 27 | [memberlite_tab item="Step 3"] 28 | 29 | Step 3: Explore Features 30 | Visit your member dashboard to access exclusive content, join discussions, and manage your account. 31 | 32 | [/memberlite_tab] 33 | [/memberlite_tabs] 34 | -------------------------------------------------------------------------------- /memberlite/memberlite-sitewide-signup-banner-example-1.php: -------------------------------------------------------------------------------- 1 | ID, '_memberlite_banner_bottom', true ); 21 | if( ( ! is_user_logged_in() || pmpro_hasMembershipLevel( 1 ) ) && empty( $memberlite_banner_bottom ) ) { 22 | ?> 23 | 34 | ID ) ) { 22 | 23 | $new_elements = array(); 24 | 25 | foreach ( $elements as $key => $element ) { 26 | 27 | $include = true; 28 | 29 | foreach ( $premium_elements as $premium_element ) { 30 | if ( ! isset( $element[1] ) || $element[1] == $premium_element ) { 31 | $include = false; 32 | break; 33 | } 34 | } 35 | 36 | if ( $include ) { 37 | $new_elements[] = $element; 38 | } 39 | } 40 | 41 | $elements = $new_elements; 42 | } 43 | 44 | return $elements; 45 | } 46 | add_filter( 'pmpro_member_profile_elements', 'my_pmpro_hide_show_profile_elements', 10, 2 ); -------------------------------------------------------------------------------- /misc/my-pmpro-assign-level-to-role.php: -------------------------------------------------------------------------------- 1 | 21 |
  • Affiliate Area
  • 22 | 25 | has_cap( 'administrator' ) ) { 25 | remove_action( 'wp_login', 'pmpro_report_login_wp_login', 10, 2 ); 26 | } 27 | } 28 | add_action( 'wp_login', 'pmpro_pre_login_check', 9, 2 ); 29 | 30 | function pmpro_remove_visits_check() { 31 | if ( current_user_can( 'administrator' ) ) { 32 | remove_action( 'wp', 'pmpro_report_login_wp_visits' ); 33 | } 34 | } 35 | add_action( 'wp', 'pmpro_remove_visits_check', 9 ); 36 | -------------------------------------------------------------------------------- /misc/pmpro_has_membership_access_filter_for_authors.php: -------------------------------------------------------------------------------- 1 | post_author == $myuser->ID ) { 18 | $hasaccess = true; 19 | } 20 | 21 | return $hasaccess; 22 | } 23 | add_filter( 'pmpro_has_membership_access_filter', 'my_pmpro_has_membership_access_filter_for_authors', 30, 4 ); 24 | -------------------------------------------------------------------------------- /misc/redirect-member-on-login.php: -------------------------------------------------------------------------------- 1 | ID ) ) { 18 | $redirect_to = '/members/'; 19 | } 20 | 21 | return $redirect_to; 22 | } 23 | add_filter( 'pmpro_login_redirect_url', 'my_pmpro_login_redirect_url', 10, 3 ); 24 | -------------------------------------------------------------------------------- /misc/redirect-member-on-logout.php: -------------------------------------------------------------------------------- 1 | ID, "pmpro_email_confirmation_key", true ); 21 | 22 | if ( $validated != 'validated' && !empty( $validated ) ) { 23 | return new WP_Error( 'user_not_verified', 'User has not validated their email' ); 24 | } 25 | 26 | return $user; 27 | } 28 | 29 | add_filter( 'wp_authenticate_user', 'my_pmpro_check_login', 10, 2 ); -------------------------------------------------------------------------------- /misc/restrict-user-login-to-active-members.php: -------------------------------------------------------------------------------- 1 | roles ) ) { 30 | return $user; 31 | } 32 | 33 | $membership_levels = pmpro_getMembershipLevelsForUser( $user->ID ); 34 | 35 | //No membership level assigned - no login allowed 36 | if ( empty( $membership_levels ) ) { 37 | return; 38 | } 39 | 40 | return $user; 41 | 42 | } 43 | add_filter( 'authenticate', 'my_pmpro_validate_membership_login', 99, 3 ); -------------------------------------------------------------------------------- /misc/show-membership-level-for-comment-author.php: -------------------------------------------------------------------------------- 1 | ID ) ) { 30 | $level = pmpro_getMembershipLevelForUser( $user->ID ); 31 | $author_text = $author_text . ' (' . $level->name . ')'; 32 | } 33 | 34 | return $author_text; 35 | } 36 | add_filter( 'comment_author', 'my_comment_author_show_membership_level', 10, 2 ); -------------------------------------------------------------------------------- /orders/add-mycred-points-whenever-order-created.php: -------------------------------------------------------------------------------- 1 | status, array( '', 'success' ) ) ) { 21 | return; 22 | } 23 | 24 | $level_id = intval( $order->membership_id ); 25 | $user_id = intval( $order->user_id ); 26 | $points = 10; // default to 0 points. 27 | $reference = 'Successful Membership Payment'; 28 | $entry = 'Paid Memberships Pro - level: ' . $level_id; 29 | 30 | switch ( $level_id ) { 31 | case 1: 32 | $points = 20; 33 | break; 34 | case 2: 35 | $points = 15; 36 | break; 37 | } 38 | 39 | // Add points to my cred 40 | mycred_add( $reference, $user_id, $points, $entry ); 41 | 42 | // Write to order notes. 43 | $order->notes .= ' MyCred points for this order: ' . $points; 44 | $order->saveOrder(); 45 | } 46 | add_action( 'pmpro_added_order', 'add_my_cred_to_pmpro_orders', 10, 1 ); 47 | -------------------------------------------------------------------------------- /payment-gateways/authorize.net/authorizenet-sent-ip.php: -------------------------------------------------------------------------------- 1 | membership_id, $order->user_id ); 28 | } 29 | add_action("pmpro_subscription_payment_failed", "my_pmpro_subscription_payment_failed"); 30 | -------------------------------------------------------------------------------- /payment-gateways/stripe/adjust-stripe-connect-fee.php: -------------------------------------------------------------------------------- 1 | id, 'stripe_checkout_session_id', true ); 24 | if ( empty( $stripe_checkout_session_id ) ) { 25 | return; 26 | } 27 | 28 | ?> 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | user_id ); // defaults to site locale if user has no locale set. 21 | 22 | // Convert WordPress locale to Stripe locale. 23 | $params['locale'] = strtolower( substr( $wp_locale, 0, 2 ) ); // Example: convert 'pl_PL' to 'pl'. 24 | return $params; 25 | } 26 | add_filter( 'pmpro_stripe_checkout_session_parameters', 'my_pmpro_stripe_checkout_parameters_user_locale', 10, 3 ); 27 | -------------------------------------------------------------------------------- /restricting-content/README.md: -------------------------------------------------------------------------------- 1 | # Snippets Library for Paid Memberships Pro - Template 2 | 3 | This README.md file has been used as a template while setting up the folder structure of this repo. -------------------------------------------------------------------------------- /restricting-content/allow-access-for-admins.php: -------------------------------------------------------------------------------- 1 | action == 'add' && $screen->base == 'post' && in_array( $screen->post_type, array( 'post', 'page' ) ) ) { 21 | ?> 22 | 26 | You must have one of the following membership levels to access this content:

    !!levels!!

    "; 17 | return $body; 18 | } 19 | add_filter( 'pmpro_no_access_message_body', 'my_pmpro_custom_no_access_message_body', 10, 2 ); 20 | -------------------------------------------------------------------------------- /restricting-content/filter-pmpro-no-access-message-header.php: -------------------------------------------------------------------------------- 1 | ID, null, true ); 21 | $level_ids = $access[1]; 22 | 23 | if ( is_array( $level_ids ) && in_array( 2, $level_ids ) ) { 24 | $text = '

    This page requires a Bronze Account of higher.

    Upgrade Now »

    '; 25 | } elseif ( is_array( $level_ids ) && in_array( 3, $level_ids ) ) { 26 | $text = '

    This page requires a Silver Account or higher.

    Upgrade Now »

    '; 27 | } else { 28 | $text = '

    This page requires a Gold Account or higher.

    Upgrade Now »

    '; 29 | } 30 | 31 | return $text; 32 | } 33 | add_filter( 'pmpro_non_member_text_filter', 'my_pmpro_non_member_text_filter', 5 ); 34 | -------------------------------------------------------------------------------- /restricting-content/lock-down-everything-but-homepage.php: -------------------------------------------------------------------------------- 1 | ID 24 | && ! is_home() 25 | && ! is_page( $okay_pages ) 26 | && ! strpos( $_SERVER['REQUEST_URI'], 'login' ) ) { 27 | wp_redirect( home_url( 'wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] ) ) ); 28 | } elseif ( is_page() 29 | && ! is_home() 30 | && ! is_page( $okay_pages ) 31 | && ! $current_user->membership_level->ID ) { 32 | wp_redirect( home_url() ); 33 | } 34 | } 35 | add_action( 'template_redirect', 'my_template_redirect' ); 36 | -------------------------------------------------------------------------------- /restricting-content/lockdown-everything-except-homepage.php: -------------------------------------------------------------------------------- 1 | found_posts === 0 ) { 20 | global $pmpro_pages; // Assuming $pmpro_pages is a global variable 21 | $redirect_url = get_permalink($pmpro_pages['levels']); 22 | if ( $redirect_url ) { 23 | wp_redirect( $redirect_url ); 24 | exit; 25 | } 26 | } 27 | } 28 | } 29 | add_action( 'template_redirect', 'pmpro_category_no_results_redirect' ); 30 | -------------------------------------------------------------------------------- /restricting-content/redirect-non-members-away-from-member-content.php: -------------------------------------------------------------------------------- 1 | first_name ) ) { 21 | $errors[] = 'Please enter a first name.'; 22 | } 23 | } 24 | add_action( 'pmpro_user_profile_update_errors', 'pmpro_make_profile_fields_required', 10, 3 ); 25 | -------------------------------------------------------------------------------- /user-fields/save-function-add-user-field-filter.php: -------------------------------------------------------------------------------- 1 | name ) { 20 | // Add save function for our field. 21 | $field->save_function = 'custom_callback_function_name'; // Set to your callback function name. 22 | } 23 | 24 | return $field; 25 | } 26 | add_filter( 'pmpro_add_user_field', 'my_pmpro_user_field_add_save_function_example', 10, 2 ); 27 | 28 | // Custom callback function 29 | function custom_callback_function_name( $field_value ) { 30 | // Do something 31 | } 32 | -------------------------------------------------------------------------------- /user-fields/update-price-by-conditional-user-field.php: -------------------------------------------------------------------------------- 1 | initial_payment = $level->initial_payment + 100; 24 | //$level->billing_amount = $level->billing_amount + 100; //to update recurring payments too 25 | } 26 | 27 | return $level; 28 | } 29 | add_filter("pmpro_checkout_level", "my_pmpro_checkout_level"); --------------------------------------------------------------------------------