分类: Wordpress

  • WordPress网站如何绑定多个域名设置教程分享

    用过wordpress的站长应该知道,wordpress在安装时会默认绑定当前域名,以后无法再绑定其他域名,但是页面的链接还是安装时的域名。所以今天我想和大家分享一下wordpress是如何绑定多个域名或者取消addon域名限制的。

    1. 打开网站根目录下的wp-config.php,在define(‘WP_DEBUG’, false);后面添加下面内容

    define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
    define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
    

    这两句话的意思是将网站的域名设置为当前访问的域名,也就是取消域名的绑定。如果不需要任何域名访问,只需要几个域名,可以这样做:

    $domain = array("www.a.com", "www.b.com", "www.c.com"); 
    if(in_array($_SERVER['HTTP_HOST'], $domain)){
        define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
        define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
    }
    

    把指定的域名放在$domain数组里面即可。

    注意:

    如果是https,请修改代码里面的http://为https://;

    如果网站安装在二级目录,则将’http://’ . $_SERVER[‘HTTP_HOST’]修改为’http://’ . $_SERVER[‘HTTP_HOST’].’/对应目录名’

    2.完成以上工作后,你的网站已经可以实现多域访问了,但是还有一个问题,就是静态资源。wordpress上传的图片插入文章,地址固定。修改域名后,图片的域名不会被修改,所以需要修改静态文件地址,可以用下面的代码解决:

    define( 'WP_CONTENT_URL',  '//' . $_SERVER['HTTP_HOST'] . '/wp-content');
    

    在上面的代码下面加上这段代码就行了。

    好了,在这里你的网站已经完美的突破了附加域的限制。

  • Modown8.7模板兔主题明文开源版附赠Erphpdown15.21付费插件和演示数据WP主题源码

    Modown8.7模板兔主题明文开源版附赠Erphpdown15.21付费插件和演示数据WP主题源码

    该主题已测试Modown8.7模板兔主题明文开源无限制版上传即激活无需授权,主题包里带详细图文搭建教程演示数据,这可能是新手最喜欢的可省去首页复杂的排版设置了,这套WordPress主题模板适用于知识付费、资源博客、视频教程、素材下载站等主题源码,主题自带团购等功能,主题包内附带赠送对应主题的Erphpdown15.21付费插件免授权版以及功能演示数据。有喜欢的小伙伴自行下载学习研究,还是那句话开心版总归开心版更新随缘,主题模板仅供个人学习参考请勿用于商业用途。

    Modown是基于Erphpdown wordpress下载插件开发的一款付费下载资源、付费下载源码、收费附件下载、付费阅读查看隐藏内容的WordPress主题,一款针对收费付费下载资源/付费查看内容/付费阅读/VIP会员免费下载查看/虚拟资源售卖的WordPress主题,一款为erphpdown而生的wp主题。集付费下载资源、付费查看内容于一体,包含体验VIP、包月VIP、包年VIP、终身VIP权限,用户推广拿提成提现,VIP免费下载资源、VIP每日下载次数限制,集成官方支付宝/微信支付接口、多个个人免签支付接口。

    主题描述:

    主题文件全解全开源,免授权免激活,无域名限制。

    修复bug,投稿页支持ajax无刷新投稿,后台可单独给某用户发通知(v8.71    2023.02.17)

    优化主题,代理QQ微博登录兼容彩虹登录系统(需使用最新的oauth文件夹覆盖到网站根目录),新增一款免费子主题C1(已内置到下载包里);马上要2023年春节了,预祝大家新年快乐!(v8.7    2023.01.13)

    修复bug,优化js css文件加载,优化php8.0兼容(v8.63    2023.01.01)

    主题演示:

  • DUX主题7.6开心版适用于科技博客或个人站wordpress主题模板扁平化设计

    DUX主题7.6开心版适用于科技博客或个人站wordpress主题模板扁平化设计

    DUX主题7.6开心版适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置,小编测试正常使用顺手去除了管理页面底部广告,源码开源的适合喜欢折腾的小伙伴二次开发,这个主题用的人也比较多的,自行下载学习研究吧。

  • Ripro日主题9.1开源修正版适用于知识付费资源素材博客WordPress主题模板

    Ripro日主题9.1开源修正版适用于知识付费资源素材博客WordPress主题模板

    由于最近fa图标的源网址失效导致后台菜单图标不显示异常,Ripro主题官方升级了9.0修复版,小编整合之前的全解开源修正版重新进行修复优化后改为9.1.0版本,另增加了纯文本小工具一排三列自适应展示符合现代主题审美,还是那句提示,开心版总归开心版仅供个人学习,如果运营还是要支持正版。

    版本概述:

    重新整合优化主题源码全开源提升版本为Ripro 9.1.0

    支持易支付接口对接,修复登录报错,修复无法开通VIP

    修复后台设置菜单ico图标显示异常bug

    新增首页纯文字标题工具一排三列自适应展示

    版本演示:

  • 适配B2主题的WordPress外链跳转插件AnyLink

    适配B2主题的WordPress外链跳转插件AnyLink

    适配B2主题的WordPress外链跳转插件AnyLink

    WordPress内容中如果有外链,据说直接跳转会传递权重。另外也可能会误导用户。我们可以做一个中间页,起到提醒的作用,撇清与外链的关系。有很多插件可以实现这样的功能,也有人用代码来实现。本站使用了Anylink这款插件。通过一个简单的小改造,实现了和B2主题完美融合的效果。

    适配B2主题的WordPress外链跳转插件AnyLink

    Anylink插件功能齐全,可以批量转换历史文章,也支持自定义类型的文章。在发布文章时就会按你的设置自动处理外链了。如果你使用的是其他的WordPress主题,可以自己在官方插件库中安装,然后自己修改插件根目录的re.php文件。如果你也使用B2主题,直接下载文章后面的插件安装即可。

    需要注意的是,使用时,如下图所示,将【跳转HTTP代码】选项设置为【JavaScript中间页跳转】。

    适配B2主题的WordPress外链跳转插件AnyLink

    其他设置根据自己需要调整,功能还是很强大的!

    适配B2主题的WordPress外链跳转插件AnyLink
  • WordPress无缝配合CloudFront实现CDN加速

    WordPress无缝配合CloudFront实现CDN加速

    Introduction

    AWS cloudfront or Amazon cloudfront is a content delivery network(CDN) service. It deliver data into end users up on request through secure, low latency, high speed network. The AWS CDN physical servers, are integrated to AWS global infrastructure and with other AWS services like Amazon EC2, Amazon S3, Load Balancing etc.

    Benefits

    • Amazon CloudFront is globally distributed with highly-resilient Amazon backbone network.
    • We don’t have to pay for any data transferred between AWS other services and with CloudFront.
    • Highly programmable using Lambda@Edge functions and can run our custom codes.
    • Amazon CloudFront supports API calls, WebSocket traffic. Also supports proxy methods like POST, PUT, OPTIONS, DELETE and PATCH.
    • CloudFront has the option of modifying the original Headers from client.

    Normal Work Flow of AWS CloudFront.

    • An End User access a website and request and image object to download through browser.
    • DNS service route the end user request to the nearest CloudFront edge location.
    • CloudFront edge location server checks its cache for the requested files and return the results to the end user.

    The pricing

    The Amazon CloudFront charges are mainly based on below areas. The details can be found from the AWS website and using AWS monthly calculator. There will be a slight change in price according to the Region.

    DATA TRANSFER OUT (INTERNET/ORIGIN)
    HTTP/HTTPS REQUESTS
    INVALIDATION REQUESTS
    FIELD LEVEL ENCRYPTION REQUESTS
    DEDICATED IP CUSTOM SSL CERTIFICATES ASSOCIATED WITH A CLOUDFRONT DISTRIBUTION

    Currently the aws cloudfront has 216 Points of Presence or edge locations available or called by the name amazon CDN locations. Each edge locations are inter connected and sync our data automatically. The updated list can be found from the Amazon website itself.

    Benefits of Using cloudfront In WordPress

    • WordPress holds 28% of the web market share but there is room for improvement. Here comes the picture of cloudfront in WordPress.
    • Cloundfront increase the performance of our website by reducing server load.
    • It reduces the cost of operating your WordPress infrastructure by reducing Resource Allocation.
    • Reduces the traffic towers to the origin server by serving cached results to the end users.
    • The DNS server will hit the CloudFront CDN first and serve a copy of the content to the end users from cache and from the closet aws cloudfront edge locations related to the end user Geo location. The Cloudfront will pull content from the behind application servers or any other integrated service as it becomes new or something changed.
    • We will have option for cloudfront gzip which can reduce the size of the data send to end users by 70 percent.
    • Have the option named cloudfront http2 which will also support http2 versions.

    Some CloudFront definitions.

    TerminologyDefinitions
    DistributionAn DNS endpoint name we can use to send traffic. Normally we point our domain name to the distribution via DNS
    OriginThis is where our applications hosted. An origin can be either an Amazon S3 bucket or an HTTP server.
    BehaviorA URL pattern and its associated caching behaviour.

    In our case we create multiple behaviors for the various WordPress URL requests and all that using single Origin and Distribution. Example Behavior are like WordPress admin pages should never be cached and other pages can be cached for a period of time.

    In the case of WordPress, we have the following files/folders to think about

    Folder Paths or FilesContent or Usage
    /wp-content/* and /wp-includes/*Most of the static assets and theme files will likely be here
    /wp-admin/* and /wp-login.php*The admin pages
    /wp-json/*The root URL for the REST API
    /contact/Replace this url with your own contact form url
    /wp-signup.phpUsed for visitor signups if your site supports it
    /wp-trackback.phpBlog post trackback functionality
    /xmlrpc.phpThe WordPress API
    /wp-cron.phpWordPress scheduled task functionality
    /.well-known/*This is a required route for Let’s Encrypt postbacks
    Everything elseHomepage, sub pages, blog posts, etc.

    So lets get started and see how we can setup Amazon CloudFront with WordPress.

    Section 1. Create Cache Policy

    Using this policy key settings we specify the values in viewer requests that CloudFront includes in the cache key. The values that we include in the cache key are automatically included in requests that CloudFront sends to the origin. For WordPress websites we need create cache policy like below.

    For that Log into the AWS management panel and go to the “CloudFront service” section.

    Under “Policy” option and under “Cache” tab click “Create cache policy” button

    A new window will open from there use below settings and hit create button.

    Give a Name for Policy we create, Like “Custom-Managed-Cache-Policy”.
    Minimum TTL 1
    Maximum TTL 31536000
    Default TTL 86400
    Whitelist the headers “Host,origin and Referer”
    Allow “All” for Cookies and Query Strings.
    Compression support gzip only

    Refer above screenshot so you will get an idea about how the cache policy will look like. Now lets move to the next section.

    Section 2. Create Origin Request Policy

    In this section we are creating our own origin request policy to customise the information from the viewer request that you want CloudFront to include in the origin request for proper working of our WordPress websites. We needed this because Some information from the viewer request, such as URL query strings, HTTP headers, and cookies, is not included in the origin request by default. So lets get started.

    From the AWS management panel itself and go to the “CloudFront service” section.

    Under “Policy” option and under “Origin Request” tab click “Create origin request policy” button

    A new window will open from there use below settings and hit create button.

    Give a name like “Custom-headers-passed”
    whitelist the headers “Host,origin, Referer , CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer and CloudFront-Is-Tablet-Viewer”
    WordPress makes extensive use of cookies, and we need forward at least below cookiescomment_author_*
    comment_author_email_*
    comment_author_url_*
    wordpress_logged_in_*
    wordpress_test_cookie
    wp-settings-*
    PHPSESSID
    wordpress_*
    wordpress_sec_*
    There are lots of places where WordPress will use query strings in the URL, so we need to instruct CloudFront how to handle those as well. So Choose “All”

    Now Again create Another Origin request Policy with name “Custom-Header-Passed-NoCache”. In that use below settings and hit create button.

    Headers – All viewer headers
    Cookies – All
    Query strings – All

    Okay, by creating above two origin request policy, using one policy  we define selected Headers pass to or forward to origin from Cloudfront as per the origin request policy. We Choose only minimum Host headers that we need to pass. This policy will later used for caching the client request types according to the behaviour under our Cloudfront distribution.

    Using the other origin policy  our CloudFront  distribution will not cache objects but will instead send all requests to your Origin for processing. This policy will be used for WordPress URL request types that we don’t wish to cache by Cloudfront.

    Suppose we use any policy with Headers, Cookies and query string values as “None” then CloudFront could serve the wrong content in certain circumstances, such as when you host content for multiple websites on the same server. So make sure you don’t use any such Origin policy for your Cloudfront distribution.

    So in short we will use these policy according to different type of Behaviour we create on our Cloudfront distribution. Below screenshots will show the settings of two origin request  policy we created.

    Okay, this completes the creation of Custom Origin policy section. Now lets move to the next section.

    Section 3. Issue SSL Certificate

    In this section we are issuing SSL certificate for our WordPress domain name using “AWS Certificate Manager”. The SSL issues through ACM is free of cost. Once we purchased it Normally it will be issued with in 15 Min.

    During the creation of Cloudfront distribution we normally input our websites name in the Alternate Domain Names (CNAMEs) filed. In such cases for those domain names SSL is must thing other wise we will get error like below during the creation of Cloudfront distribution.

    Error occurred
    Bad request.
    (InvalidChangeBatch 400: RRSet of type CNAME with DNS name example.com. is not permitted at apex in zone example.com.)

    So lets see how this can be implemented. We already discussed the steps for issuing SSL/TLS certificate using “AWS Certificate Manager” as a separate blog article. Refer below link if you are looking to issue SSL certificate other wise move to next section. I am not mentioning the steps in this article for avoiding the duplication.

    Section 4. Create Distribution

    In this section we are creating the Cloudfront distribution for our WordPress website. By default CloudFront distribution caches all requests to the origin specified by Origin definition. Means behaves as full page cache and we also have the option to implement custom origin-pull patterns. So lets get started.

    Log into the AWS management panel and go to the “CloudFront service” section.

    Under Distribution click on “Create Distribution”

    The create distribution window will open. In that the first section is origin.

    • In the “Origin Domain Name” field use our Public DNS host-name of EC2 instance where our WordPress Website Hosted because the ec2 instance is our HTTP server.
    • Choose the “Origin Protocol Policy” as “HTTPS Only”. This is how CloudFront communicates with our Origin WordPress EC2 instance server.
    • Choose “Minimum Origin SSL Protocol” as “TLSv1” even though Amazon suggest to use the latest supported one by the server. But the problem with that, is some time the end user having older version of browser will have an issue with loading our website over HTTPS.
    • Leave the filed “Origin path” as blank. By using this filed we can modify the header send by the end user and can insert our desired value.
    • The “Origin name” field will be auto filled and it will be our EC2 instance Public DNS host-name. So Leave it as it is.
    • Leave the “Add custom header” option as blank. We don’t want to insert any customer header value in the origin request.
    • Choose Enable Origin Shield option as “No”. The Origin Shield is is an additional caching layer that can help reduce the load on your origin and help protect its availability but right now we are not choosing this option.
    • Change the value for ” Keep-alive timeouts” into “60” if you website is having low traffic other wise leave it with the default value “5”.
    • Leave other timeout related settings as it is. Basically this time out settings deals with how CloudFront will handle requests to our origin server.
    • Choose the “Compress objects automatically” as yes. CloudFront will compress certain files when the requesting viewer
      or browser includes the header: “Accept-Encoding: gzip”. Delivering compressed objects will improve performance for your users.
    • Choose “Viewer Protocol Policy” as ” Redirect HTTP to HTTPS “. This controls how our end users connect to Cloudfront.
    • Choose ” Allowed HTTP Methods ” as ” GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE ” because, WordPress use POST methods.
    • Cached HTTP methods, leave it as it is.
    • Choose “Restrict Viewer Access(Use Signed URLs or Signed Cookies) as “No”
    • Choose “Cache policy and origin request policy” for Cache key and origin requests.
    • In “Cache Policy” choose our cache policy named “Custom-Cache-Policy” from the drop down menu available next to it.
    • In the “Origin Request Policy”  choose the origin policy as “Custom-headers-passed” from the drop down menu.
    • Leave the “Response Headers Policy” as blank.
    • Choose “Smooth Streaming” as No
    • Leave “Field Level Encryption” option  as blank.
    • Choose “Enable real-time logs” option as No. This only need to enable when we need to debug our cloudfront requests.
    • Leave the “Function associations ” option as blank.
    • In “Price Class” Choose ” Use All Edge Locations”
    • AWS WAF Web ACL as ” None “
    • Alternate Domain Names (CNAMEs)  field give our domain names, like example.com and www.example.com
    • Choose  our  website “SSL Certificate”  generated through AWS certificate manager  from drop down menu available for  ” Custom SSL certificate” option.
    • Leave the “Legacy Clients Support” option as it is. Don’t enable this option.
    • Security Policy as ” TLS1.2_2021″
    • Choose Supported HTTP Versions as  “HTTP/2, HTTP/1.1, HTTP/1.0”
    • Default Root Object , leave as blank, only needed when our website is hosted in S3 bucked
    • Choose Logging  option as  “Off”
    • Choose Enable IPv6  option as  “yes”

    Finally verify the setting again by referring above screenshots and Click Create Distribution. Initially we can see the Cloudfront in progress status and after few minutes we can see the status as “Deployed” and ready to use. This completes the Creation of CloudFront Distribution. Now lets move to the Next section.

    Section 5. Edit Distributions Behaviour.

    In this section we edit the default behaviour of our created distribution which is to cache all request types. But we also need not to cache some of the WordPress URL request pattern types which are give below. We don’t need our wp-admin area and other links mentioned above to be cached by Cloudfront because caching above URL patterns will cause issues to the proper working of a WordPress website. So lets see how these can be done.

    URL PatternUse CasesCaching Status
    /wp-login.phpThe admin pagesNo
    /wp-admin/*The admin pagesNo
    /wp-json/*The root URL for the REST APINo
    /contact/Our Web page contact form url.Replace this url with your own contact form urlNo
    /.well-known/*This is a required route for Let’s Encrypt postbacksNo
    /wp-cron.phpWordPress scheduled task functionalityNo
    /xmlrpc.phpThe WordPress APINo
    /wp-trackback.phpBlog post trackback functionalityNo
    /wp-signup.phpUsed for visitor signups if your site supports itNo

    For that from AWS Panel itself , under Cloudfront services, click on CloudFront Distributions

    click  on ID corresponding to our cloudfront distribution created.

    Click “Behaviour” tab >> Click create New behaviour and use below settings.

    We need to create  new behaviour for each of above listed WordPress URL from the “create behaviour” window. For each behaviour only Path pattern field changes according to the url request types but the rest of the settings will be same.

    • In Path pattern field Give our url like /wp-login.php
    • In Origin or Origin Group   Choose our EC2 instance name available.
    • Choose ” Compress Objects Automatically” as “Yes”.
    • In Viewer Protocol Policy  choose “Redirect HTTP to HTTPS”
    • In Allowed HTTP Methods  choose “GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE”
    • Cached HTTP methods Choose “Options” too
    • Choose “Restrict Viewer Access(Use Signed URLs or Signed Cookies) as “No”
    • Choose “Cache key and Origin Request policy ” as  “Cache policy and origin request policy”
    • Choose Cache Policy as “Custom-managed-Cache-Policy”, this is the cache policy we created in earlier section.
    • Now for the “origin Request Policy”  choose  policy named “Custom-header-Passed-NoCache”. Using this policy we are instructing our CloudFront distribution to not cache when the url request type is /wp-login.php.
    • Leave “Response Header policy” option as blank.
    • Leave “Field-level Encryption Config” as blank.
    • Choose “Smooth Streaming”  as No
    • Choose “Enable real time logs ” as No
    • Leave function associations  option as blank and Save it.

    Repeat the above steps for each URL path pattern. Once completed, the behaviour tab will look like below.

    Now we excluded above WordPress related URL from cached by CloudFront. We don’t need our wp-admin area and other links mentioned above to be cached by CloudFront because caching above URL patterns will cause issues to the proper working of a WordPress website. This completes the editing the behaviour of CloundFront distribution we created. Now lets move to the next section.

    Section 6. Change DNS.

    In this section we are changing our WordPress website DNS A record. For that go the DNS manager section of your own website and create a CNAME pointing www.example.com or example.com at your CloudFront Distribution DNS endpoint. Also don’t forget to delete the existing DNS A records from making conflicts.

    If you are using Route53 as your DNS zone manager. If try to change the record type as CNAME for existing DNS A record type and input the CloudFront Distribution DNS endpoint name. We will get below error.

    Error occurred
    Bad request.
    (InvalidChangeBatch 400: RRSet of type CNAME with DNS name example.com. is not permitted at apex in zone example.com.)

    In order to fix For that go back to AWS panel again
    From the services section choose Route 53 service
    click “Hosted zones” option from the left side
    Now click our website name and the existing DNS records will show up
    select our domain DNS A record and click edit from the right side options

    Choose the Record Type as ” Route traffic to an IPV4 address and somw AWS resources”
    and then enable the alias option
    and then in the route traffic to option, from the drop down menu choose ” alias to cloudfront distribution ”
    gave the CloudFront Distribution DNS endpoint name in the next drop down menu. We can also get the cloudfront distribution DNS endpoint name from the cloudfront services section too.

    Refer below screenshot for a reference.

    Wait for completing the DNS propagation and if we test the domain using curl, we can see “Server: CloudFront”. The Curl command output is given below for your reference.

     curl -v example.com
    * Rebuilt URL to: example.com/
    *   Trying 11.3.45.2...
    * TCP_NODELAY set
    * Connected to example.com (11.3.45.2) port 80 (#0)
    > GET / HTTP/1.1
    > Host: example.com
    > User-Agent: curl/7.58.0
    > Accept: */*
    > 
    < HTTP/1.1 301 Moved Permanently
    < Server: CloudFront
    < Date: Fri, 31 Jul 2020 04:50:10 GMT
    < Content-Type: text/html
    < Content-Length: 183
    < Connection: keep-alive
    < Location: https://example.com/
    < X-Cache: Redirect from cloudfront
    < Via: 1.1 7d2d57745dfgfdgf.cloudfront.net (CloudFront)
    < X-Amz-Cf-Pop: MAA50-C2
    < X-Amz-Cf-Id: zsF3xHc3KIJ-asC-PkWl3I8uw==
    
    <html>
    <head><title>301 Moved Permanently</title></head>
    <body bgcolor="white">
    <center><h1>301 Moved Permanently</h1></center>
    <hr><center>CloudFront</center>
    </body>
    </html>
    * Connection #0 to host example.com left intact
    * Connection #0 to host example.com left intact

    This Completes the DNS changes for our WordPress Website. Now lets move to the Next section.

    Section 7. Use WordPress Cache Plugin

    Now lets proceed with the Use of a Cache Plugin that support CloudFront. When we use WordPress plugin related to CloudFront for site acceleration, the plugin uses a subdomain, also known as an alternate domain name or CNAME, to send your website’s traffic through CloudFront.

    Without this plugin, all the traffic of your website’s viewers goes to the server that hosts your WordPress website. So lets get started. Lets use a Plugin named W3TC.

    Setting Up W3TC

    • Log in to the WordPress administration panel.
    • Browse to the “Plugins” menu page and ensure that the “W3 Total Cache” plugin is installed. If not install it.
    • Activate the plugin by clicking the “Activate” link.
    • Browse to the “Performance -> General Settings” page.
    • In the “CDN” section, enable “CDN” and set the “CDN Type” field to “Generic Mirron”. Click the “Save Settings and Purge Caches” button.
    • Browse to the “Performance -> CDN” page.
    • In the “Configuration: Objects” section
    • In the “Replace Sites Hostname” filed with your own domain name. Click On “Test Mirror” Button and Make sure we get Passed message. Save the settings.

    Okay, this completes setting up our WordPress Cache plugin W3TC for using our created CloudFront distribution.

    Conclusion.

    In this article we discussed about how to Setup CloudFront for our WordPress Website. Enabling CloudFront for our Website will usually improve response time. I hope this article is informative. Leave your thoughts at below comment box.

  • WordPress外链跳转插件:Go Url

    对于文章中插入的站外链接,安全未知,也不希望对这些页面传递权重,因此希望生成一个短网址,并给这个链接添加nofollow属性。

    WordPress外链跳转插件Go Url可自动替换文章内站外链接为短网址,并添加nofollow属性,并且不影响原有的文章数据,插件创建gourls表来保存生成的短网址。

    插件功能如下:

    • 自动生成短网址替换站外链接,不会修改文章数据;
    • 站外链接添加nofollow属性;
    • robots.txt自动添加禁止抓取go目录规则;
    • SiteMap地图过滤跳转页面,不用担心SEO问题;
    • 网站后台可以管理已生成的短网址,并且可以手动添加URL。

    生成的短网址格式如下:

    https://www.wucuoym.com/go/d8iK8yhh
  • WordPress 6.x 外部入库接口php文件(可适用于火车头,高铁,ET等)

    建议配合这个发布模块使用

    [b2_insert_post id=”638″]

     

    <?php
    /*
    WordPress免登录发布接口,支持最新Wordpress6.x
    
    更新说明
    T3: 2023.7.03
    1、优化了验证标题重复
    2、优化了附件、图片、缩略图的上传和生成
    
    ■ 功能特性:
    
    分类(category):
    1、分类支持分类名和分类ID, 系统自动判断
    2、多分类处理(多个分类请用逗号隔开)
    3、自动创建分类,如果网站内没有这个分类,会自动创建分类。
    4、自动创建父分类, 适用于想要设置父分类并且网站中不存在. 使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 post_parent_cate
    5、添加分类描述 使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 category_description
    
    标签:
    1、多标签处理(多个标签请用逗号隔开)
    
    作者:
    1、多作者处理, 可设置多个作者随机发布文章, 发布参数中指定post_author
    2、自定义作者功能,如果提交的数据为用户名的话,会自动检测系统是否存在该用户,如果已存在则以该用户发布,不存在则自动新建用户(接口以针对中文用户名进行了处理)
    
    图片和缩略图:
    1、Web图片上传,无需FTP上传
    2、自动设置【标签:内容】的第一张图片为文章的特色图片.
    3、支持自定定义缩略图(特色图像) 使用方法: WEB发布模块/高级功能/文件上传设置/ 增加 缩略图所在的标签,表单名为: thumb递增数字
    3、标准的php.ini单次最大文件上传数为20个, 如果发布的内容附件超过20个,将会出错. 如果遇到此问题请更改php.ini的max_file_uploads 参数 . 或者更换上传方式为FTP
    
    时间和预约发布:
    1、正确的时间格式为2017-10-01 23:45:55或者2017-10-01 23:45
    2、自动处理服务器时间与博客时间的时区差异
    3、随机时间安排与预约发布功能: 可以设定发布时间以及启用预约发布功能. 启用预约发布后,如果POST过来的数据包涵时间,则以时间为准立即发布,反之则以接口文件配置时间发布。
    
    评论:
    1、发布评论,支持评论时间、评论作者、评论内容, 需要在火车头->Web发布模块/内容发布参数/ ->新增 comment、commentdate、commentauthor三个参数,分别对应评论内容、评论时间、评论作者. 三个参数缺一不可
    
    其它:
    1、标题重复判断, 打开参数配置中的$checkTitle,即可判断标题是否重复,对于重复结果不予发布.
    2、发布文章后自动ping,需要再后台设置->撰写->更新服务 填入ping地址
    3、'pending review' 更新文章状态pending(审核) 为 publish(所有人可见)
    
    自定义字段
    1、使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 post_meta['字段名']
    
    自定义文章类型(post_type)
    1、使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 post_type
    
    自定义文章形式(post_format)
    1、使用此功能需要修改配置参数 $postformat=true;并在火车头->Web发布模块/内容发布参数/->新增发布参数post_format, 标签内容必须为: 图像: post-format-image 视频: post-format-video
    
    自定义分类(taxonomy):
    1、使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 post_taxonomy, 使用taxonomy之后, 文章只能发布在taxonomy所属的分类下, 分类名称或者ID请填写在分类category
    
    自定义分类--多个分类--(taxonomy):
    1、使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 post_taxonomy_list[taxonomy_name], 使用后可以将文章归属到多个自定义分类下, 多个term必须使用|||隔开
    
    自定义分类信息(add_term_meta)
    1、使用方法: WEB发布模块/高级功能/内容发布参数/ -> 增加 post_cate_meta['meta_key'], 标签内容可以为文本或者数组,数组必须参照格式: key$$value|||key$$value|||key$$value
    
    模块参数列表:
    post_title 必选 标题
    post_content 必选 内容
    tag 可选 标签
    post_category 可选 分类
    post_date 可选 时间
    post_excerpt 可选 摘要
    post_author 可选 作者
    category_description 可选 分类信息
    post_cate_meta[name] 可选 自定义分类信息
    post_meta[name] 可选 自定义字段
    post_type 可选 文章类型 默认为'post'
    post_taxonomy 可选 自定义分类方式
    post_format 可选 文章形式
    
    */
    
    //-------------------配置参数开始,根据需要修改-------------------------
    $post_author_default = 1; //默认作者的id,默认为admin(这里是作者ID号码,并非作者名)
    $post_status = 'future'; //立即发布 pending 审核 draft 草稿箱
    $time_interval = '1'; //发布时间间隔,单位为秒 。可设置随机数值表达式,如12345 * rand(0,17),设置为负数可将发布时间设置为当前时间减去这里设置的时间
    $post_next = 'now'; //now:发布时间=当前时间+间隔时间值 //next: 发布时间=最后一篇时间+间隔时间值
    $post_ping = false; //发布后是否执行ping
    $translate_slug = false; //是否将中文标题转换为MD5值,如需开启请设置为true或MD5值长度,建议设置为大于10,小于33的数字。
    $secretWord = false; //接口密码,如果需要密码,则设为$secretWord='你的密码';
    $checkTitle = false; //检测标题是否重复
    $postformat = true; //开启文章形式
    //-------------------配置参数结束,以下请勿修改-------------------------
    
    //开始
    if(isset($_GET['action'])){
    $hm_action=$_GET['action'];
    }else{
    die("操作被禁止>");
    }
    
    $post = $_POST;
    
    include_once "./wp-config.php";
    if($post_ping) require_once("./wp-includes/comment.php");
    
    if($hm_action== "list"){
    hm_print_catogary_list();
    }elseif($hm_action== "update"){
    hm_publish_pending_post();
    }elseif($hm_action == "save"){
    //检查通讯密码
    if (isset($secretWord)&&($secretWord!=false)) {
    if (!isset($_GET['secret']) || $_GET['secret'] != $secretWord) {
    die('接口密码错误,请修改配置文件或者修改发布参数,保持两者统一。');
    }
    }
    
    extract($post);
    //判断标题是否为空
    if ($post_title=='[标题]'||$post_title=='') {die('标题为空');}
    //检查标题是否重复
    if($checkTitle){
    $post_title = trim(hm_strip_slashes($post_title));
    $sql = "SELECT `ID` FROM $wpdb->posts WHERE `post_title` = '$post_title'";
    $t_row = $wpdb->query($sql);
    if($t_row) {die('标题重复,发布成功');};
    }
    //判断标题是否为空
    if ($post_content=='[内容]'||$post_content=='') {die('内容为空');}
    //检查自定义文章类型
    if (empty($post_type) || strpos($post_type, '[') || strpos($post_type, ']')) {$post_type='post';}
    //检查自定义分类目录
    if (empty($post_taxonomy) || strpos($post_taxonomy, '[') || strpos($post_taxonomy, ']')) {$post_taxonomy='category';}
    //检查分类描述是否未设置
    if (empty($category_description) || strpos($category_description, '[') || strpos($category_description, ']')) {$category_description='';}
    //检查自定义字段
    if(array_key_exists('post_meta', $post)){$post_meta = $post['post_meta'];}
    //检查自定义分类信息
    if(array_key_exists('post_cate_meta', $post)){$post_cate_meta = $post['post_cate_meta'];}
    //检查发布时间
    if (!isset($post_date) ||strlen($post_date)<8) $post_date=false;
    //检查作者
    if (empty($post_author)) {
    $post_author=$post_author_default;
    } else {
    $post_author=hm_add_author($post_author);
    }
    
    $post_content = fileHandle('fujian',$post_content);
    fileHandle('thumb');
    
    hm_do_save_post(array('post_title'=>$post_title,
    'post_content'=>$post_content,
    'post_category'=>$post_category,
    'post_excerpt'=>$post_excerpt,
    'post_type'=>$post_type,
    'post_taxonomy'=>$post_taxonomy,
    'tags_input'=>$tag,
    'post_date'=>$post_date,
    'post_author'=>$post_author,
    'fujianid'=>$fujianid));
    echo '发布成功';
    }else{
    echo '非法操作['.$hm_action.']';
    }
    
    //附件处理
    //$filename 附件名称
    //$content 标签内容,为空返回首张图片ID
    function fileHandle($filesnames, $content = null)
    {
    global $thumbid;
    if (!empty($_FILES[$filesnames.'0']['name'])) {
    require_once('./wp-load.php');
    require_once('./wp-admin/includes/file.php');
    require_once('./wp-admin/includes/image.php');
    $i = 0;
    while (isset($_FILES[$filesnames.$i])) {
    $fujian[$i] = $_FILES[$filesnames.$i];
    $filename = $fujian[$i]['name'];
    $fileExt=array_pop(explode(".", $filename));
    //附件保存格式【时间】
    $upFileTime=date("YmdHis");
    //更改上传文件的文件名为时间+随机数+后缀
    $fujian[$i]['name'] = $upFileTime."-".uniqid().".".$fileExt;
    $uploaded_file = wp_handle_upload($fujian[$i], array('test_form' => false));
    $content = str_replace("\'".$filename."\'", "\"".$uploaded_file[url]."\"", $content);
    $content = str_replace($filename, $uploaded_file[url], $content);
    if (isset($uploaded_file['error'])) {
    echo "文件上传失败";
    wp_die($uploaded_file['error']);
    }
    $file = $uploaded_file['file'];
    $new_file = iconv('GBK', 'UTF-8', $file);
    $url = iconv('GBK', 'UTF-8', $uploaded_file['url']);
    $type = $uploaded_file['type'];
    $attachment = array(
    'guid' => $url,
    'post_mime_type' => $type,
    'post_title' => $filename,
    'post_content' => '',
    'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment($attachment, $new_file);
    if (strpos($fujian[$i]['type'], 'image') !== false) {
    if(empty($thumbid) || $filesnames == 'thumb') $thumbid = $attach_id;
    $attach_data = wp_generate_attachment_metadata($attach_id, $file);
    $attach_data['file'] = iconv('GBK', 'UTF-8', $attach_data['file']);
    foreach ($attach_data['sizes'] as $key => $sizes) {
    $sizes['file'] = iconv('GBK', 'UTF-8', $sizes['file']);
    $attach_data['sizes'][$key]['file'] = $sizes['file'];
    }
    wp_update_attachment_metadata($attach_id, $attach_data);
    }
    $i++;
    }
    }
    return $content;
    }
    
    function hm_tranlate($text)
    {
    global $translate_slug;
    $pattern = '/[^\x00-\x80]/';
    if (preg_match($pattern,$text)) {
    $htmlret = substr(md5($text),0,$translate_slug);
    } else {
    $htmlret = $text;
    }
    return $htmlret;
    }
    
    function hm_print_catogary_list()
    {
    $cats = get_categories("hierarchical=0&hide_empty=0");
    foreach ((array) $cats as $cat) {
    echo '<<<'.$cat->cat_ID.'--'.$cat->cat_name.'>>>';
    }
    }
    
    function hm_get_post_time($post_next="normal")
    {
    global $time_interval;
    global $wpdb;
    
    $time_difference = absint(get_option('gmt_offset')) * 3600;
    $tm_now = time()+$time_difference;
    
    if ($post_next=='now') {
    $tm=time()+$time_difference;
    } else { //if ($post_next=='next')
    $tm = time()+$time_difference;
    $posts = $wpdb->get_results( "SELECT post_date FROM $wpdb->posts ORDER BY post_date DESC limit 0,1" );
    foreach ( $posts as $post ) {
    $tm=strtotime($post->post_date);
    }
    }
    return $tm+$time_interval;
    }
    
    function hm_publish_pending_post()
    {
    global $wpdb;
    $tm_now = time()+absint(get_option('gmt_offset')) * 3600;
    $now_date=date("Y-m-d H:i:s",$tm_now);
    $wpdb->get_results( "UPDATE $wpdb->posts set `post_status`='publish' WHERE `post_status`='pending' and `post_date`<'$now_date'" );
    }
    
    function hm_add_category($post_category, $post_taxonomy = 'category')
    {
    if (!function_exists('wp_insert_category')) {include_once "./wp-admin/includes/taxonomy.php";}
    global $wpdb,$post_cate_meta,$post_parent_cate,$category_description;
    $post_category_new=array();
    $post_category_list= array_unique(explode(",", $post_category));
    foreach ($post_category_list as $category) {
    $cat_ID =$category;
    if (!isInteger($cat_ID) || $cat_ID < 1) {
    $category = $wpdb->escape($category);
    $term = get_term_by('name',$category,$post_taxonomy,'ARRAY_A');
    $cat_ID = $term['term_id'];
    if($cat_ID == 0){
    //检查父分类是否存在和创建父分类->start
    if(!empty($post_parent_cate) && $post_parent_cate != '[父分类]')
    {
    $parent = intval($post_parent_cate);
    if($parent == 0){
    $post_parent_cate = $wpdb->escape($post_parent_cate);
    $term = get_term_by('name',$post_parent_cate,$post_taxonomy,'ARRAY_A');
    $cat_ID = $term['term_id'];
    if($parent == 0){
    $parent = wp_insert_category(array('cat_name'=>$post_parent_cate, 'taxonomy'=>$post_taxonomy));
    }
    }
    $cat_ID = wp_insert_category(array('cat_name'=>$category, 'category_description'=>$category_description, 'category_parent'=>$parent, 'taxonomy'=>$post_taxonomy));
    
    }else{
    $cat_ID = wp_insert_category(array('cat_name'=>$category, 'category_description'=>$category_description, 'taxonomy'=>$post_taxonomy));
    }
    //检查父分类是否存在和创建父分类->end
    //定义分类信息->start
    if (!empty($post_cate_meta)) {
    foreach(array_unique(array_filter($post_cate_meta)) as $key => $value) {
    $value = strtoarray($value);
    add_term_meta($cat_ID, $key, $value);
    }
    }
    //定义分类信息->end
    }
    }
    array_push($post_category_new, $cat_ID);
    }
    return $post_category_new;
    }
    
    function add_category($post_category, $post_taxonomy = 'category')
    {
    if (!function_exists('wp_insert_category')) {include_once "./wp-admin/includes/taxonomy.php";}
    global $wpdb;
    $post_category_new=array();
    $post_category_list= array_unique(explode(",", $post_category));
    foreach ($post_category_list as $category) {
    $cat_ID =$category;
    if (!isInteger($cat_ID) || $cat_ID < 1) {
    $category = $wpdb->escape($category);
    $term = get_term_by('name',$category,$post_taxonomy,'ARRAY_A');
    $cat_ID = $term['term_id'];
    if($cat_ID == 0){
    $cat_ID = wp_insert_category(array('cat_name'=>$category, 'taxonomy'=>$post_taxonomy));
    }
    }
    array_push($post_category_new, $cat_ID);
    }
    return $post_category_new;
    }
    
    function isInteger($value){
    return is_numeric($value) && is_int($value+0);
    }
    
    function hm_add_author($post_author)
    {
    global $wpdb,$post_author_default;
    $User_ID =intval($post_author);
    if ($User_ID == 0) {
    $pattern = '/[^\x00-\x80]/';
    if (preg_match($pattern,$post_author)) {
    $LoginName = substr(md5($post_author),0,10);
    } else {
    $LoginName = $post_author;
    }
    $User_ID = $wpdb->get_col("SELECT ID FROM $wpdb->users WHERE user_login = '$LoginName' ORDER BY ID");
    $User_ID = $User_ID[0];
    if (empty($User_ID)) {
    $website = 'http://'.$_SERVER['HTTP_HOST'];
    $userdata = array(
    'user_login' => "$LoginName",
    'first_name' => $post_author,
    'user_nicename' => $post_author,
    'display_name' => $post_author,
    'nickname' => $post_author,
    'user_url' => $website,
    'role' => 'contributor',
    'user_pass' => NULL);
    $User_ID = wp_insert_user( $userdata );
    }
    $post_author = $User_ID;
    } else {
    $post_author = $post_author_default;
    }
    return $post_author;
    }
    
    function hm_strip_slashes($str)
    {
    if (get_magic_quotes_gpc()) {
    return stripslashes($str);
    } else {
    return $str;
    }
    }
    function checkDatetime($str){
    $date = strtotime($str);
    if($date > 31500000){
    return true;
    }else{
    return false;
    }
    }
    
    function formatdate($date){
    $d = date('Y-m-d');
    if(strpos($date, 'today') !== false){
    return str_replace('today at', $d, $date);
    }
    
    if(strpos($date, 'Today') !== false){
    return str_replace('Today at', $d, $date);
    }
    
    $dd = date('Y-m-d', time()-84600);
    if(strpos($date, 'yesterday') !== false){
    return str_replace('yesterday at', $d, $date);
    }
    
    if(strpos($date, 'Yesterday') !== false){
    return str_replace('yesterday at', $d, $date);
    }
    }
    
    //字符串转换为数组
    //字符串的格式必须为 //$str = 'eo_description$$seo_description|||seo_keywords$$seo_keywords|||seo_title$$seo_title';
    
    function strtoarray($str){
    if(strpos($str, '|||') !== false){
    $str = explode('|||', $str);
    if(strpos($str[0],'$$') !== false){
    foreach($str as $k => $v){
    $v = explode('$$', $v);
    $r[$v[0]] = $v[1];
    }
    $str = $r;
    }
    }
    return $str;
    }
    
    function hm_do_save_post($post_detail)
    {
    global $post,$post_author,$post_ping,$post_status,$translate_slug,$post_next,$post_meta,$comment,$commentdate,$commentauthor,$wpdb,$postformat,$post_format,$post_taxonomy_list,$thumbid;
    extract($post_detail);
    $post_title=trim(hm_strip_slashes($post_title));
    $post_name=$post_title;
    if ($translate_slug) $post_name=hm_tranlate($post_name);
    $post_name=sanitize_title( $post_name);
    if ( strlen($post_name) < 2 ) $post_name="";
    $post_content=hm_strip_slashes($post_content);
    $tags_input=str_replace("|||",",",$tags_input);
    if (isset($post_date) && $post_date && checkDatetime($post_date)) {
    $tm=strtotime($post_date);
    $time_difference = absint(get_option('gmt_offset')) * 3600;
    $post_date=date("Y-m-d H:i:s",$tm);
    $post_date_gmt = gmdate('Y-m-d H:i:s', $tm-$time_difference);
    } else {
    $tm=hm_get_post_time($post_next);
    $time_difference = absint(get_option('gmt_offset')) * 3600;
    $post_date=date("Y-m-d H:i:s",$tm);
    $post_date_gmt = gmdate('Y-m-d H:i:s', $tm-$time_difference);
    if ($post_status=='next') $post_status='publish';
    }
    $post_category=hm_add_category($post_category, $post_taxonomy);
    $post_data = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_type', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_name','tags_input');
    $post_data = add_magic_quotes($post_data);
    $postID = wp_insert_post($post_data);
    //设定缩略图
    set_post_thumbnail( $postID, $thumbid );
    
    //自定义分类方式(taxonomy)
    if($post_taxonomy != 'category' && !empty($post_taxonomy)){
    wp_set_object_terms($postID, $post_category, $post_taxonomy);
    }
    
    //多个自定义分类方式(taxonomy)
    if(!empty($post_taxonomy_list)){
    foreach($post_taxonomy_list as $k => $v){
    $v = strtoarray($v);
    if(is_array($v)){
    foreach($v as $kk => $vv){
    $vv = add_category($vv, $k);
    wp_set_object_terms($postID, $vv, $k);
    }
    }else{
    $v = add_category($v,$k);
    wp_set_object_terms($postID, $v, $k);
    }
    }
    }
    
    //归档文章形式->start
    if(!empty($post_format) && $postformat == true){
    if($post_format == 'post-format-image' || $post_format == 'post-format-video'){
    wp_set_post_terms($postID, $post_format, 'post_format');
    }
    }
    //归档文章形式->end
    
    //发布自定义栏目
    if (!empty($post_meta)) {
    foreach($post_meta as $key => $value) {
    $ret = add_post_meta($postID,$key,$value,true);
    if(!$ret){
    delete_post_meta($postID, $key);
    add_post_meta($postID,$key,$value,true);
    }
    }
    }
    
    //发布评论->start
    if(!empty($comment)){
    //格式化评论内容
    $comment = str_replace(array("\r\n", "\r", "\n"), "", $comment);
    $arraycomment = explode('|||', $comment);
    //格式化评论时间
    $commentdate = str_replace(array("\r\n", "\r", "\n"), "", $commentdate);
    $arraycommentdate = explode('|||', $commentdate);
    //格式化评论作者
    $commentauthor = str_replace(' ','',$commentauthor);
    $commentauthor = str_replace(array("\r\n", "\r", "\n"), "", $commentauthor);
    $arraycommentauthor = explode('|||', $commentauthor);
    //评论计数
    $comment_count = count($arraycomment) -1 ;
    //更新文章评论数
    $wpdb->get_results("UPDATE $wpdb->posts set `comment_count` = $comment_count WHERE `ID` = $postID");
    //写入评论
    foreach($arraycommentauthor as $k => $v){
    //判断评论时间
    if($v != ''){
    $format="Y-m-d H:i:s";
    $d = formatdate($arraycommentdate[$k]);
    $d = strtotime($d);
    if($d != ''){
    $date = date($format,$d);
    $gmtdate = gmdate($format, $d);
    }else{
    $date = date($format);
    $gmtdate = gmdate($format);
    }
    //写入数据库
    $res = $wpdb->get_results("INSERT INTO $wpdb->comments (`comment_post_ID`,`comment_author`,`comment_date`,`comment_date_gmt`,`comment_content`,`user_id`) VALUES ($postID,'$v','$date','$gmtdate','$arraycomment[$k]',1)");
    }
    }
    }
    //发布评论->end
    
    // 自定PING,需要再网站后台设置->撰写->更新服务器 下面填写PING地址
    if ($post_ping) generic_ping();
    }
    ?>
    
    
    
  • Pretty Link Pro v3.4.2破解版 – URL 缩短 WordPress 插件

    Pretty Link Pro v3.4.2破解版 – URL 缩短 WordPress 插件

    从您的内容中赚钱

    Pretty Links 会自动从您现有的和新的内容中释放更多的联盟收入……把它想象成一个惊喜的继承!

    将您的内容货币化的最简单、最有效的方法

    如果您可以一次性将附属链接添加到 WordPress,然后智能地自动将您的链接放置在您的所有内容中,那不是很好吗?

    这正是 Pretty Links 为您所做的。

    梳理您网站上的每个页面以找到添加附属链接的位置既乏味又耗时。即使使用基本的附属链接隐藏器,也不可能手动将最佳附属链接放置在您网站的每个页面、帖子和小部件上。

    换句话说,手动管理会员链接就像把钱留在桌上。

    Pretty Links 将这笔钱放在您的口袋里。

    用于电子邮件、播客、YouTube 等的可共享品牌附属链接

    很难通过播客、视频或印刷品来推广附属产品。那是因为附属链接通常是巨大的、丑陋的、难以阅读的,甚至更难记住。然后是电子邮件,众所周知,附属链接会失效。

    幸运的是有更好的方法。

    Pretty Links 将那些丑陋、冗长的附属链接转变为干净、令人难忘、可说、完全可共享的链接。作为链接伪装者、二维码生成器和品牌链接创建者,Pretty Links 将您的网站变成一个强大的 URL 缩短器和赚钱机器。